NopCommerce 4.20 插件开发错误与依赖注入

我有一个带有 dBContext 名称BookAppointmentDBContext和依赖项注册器的 NopCommerce 插件开发DependencyRegistrar,请参阅下面的代码片段。


public class DependencyRegistrar : IDependencyRegistrar

{

    private const string CONTEXT_NAME ="nop_object_context_bookappointment";

    public  void Register(ContainerBuilder builder, ITypeFinder typeFinder, NopConfig config)

    {

        builder.RegisterType<BookAppointmentService>().As<IBookAppointmentService>().InstancePerLifetimeScope();

        //data context

        builder.RegisterPluginDataContext<BookAppointmentDBContext>(CONTEXT_NAME);

        //override required repository with our custom context

        builder.RegisterType<EfRepository<CarInspectionModel>>()

            .As<IRepository<CarInspectionModel>>()

            .WithParameter(ResolvedParameter.ForNamed<IDbContext>(CONTEXT_NAME))

            .InstancePerLifetimeScope();

    }


    public int Order => 1;

}

和下面的 BookAppointmentDBContext 类


public class BookAppointmentDBContext : DbContext, IDbContext

{

    #region Ctor

    public BookAppointmentDBContext(DbContextOptions<BookAppointmentDBContext> options) : base(options)

    {


    }

  /*the other implementation of IDbContext as found in http://docs.nopcommerce.com/display/en/Plugin+with+data+access*/

}

另外,我有一个 BasePluglin 类


public class BookAppointmentPlugin : BasePlugin

{

    private IWebHelper _webHelper;

    private readonly BookAppointmentDBContext _context;


    public BookAppointmentPlugin(IWebHelper webHelper, BookAppointmentDBContext context)

    {

        _webHelper = webHelper;

        _context = context;

    }


    public override void Install()

    {

        _context.Install();

        base.Install();

    }

    public override void Uninstall()

    {

        _context.Uninstall();

        base.Uninstall();

    }

}


我已经BookAppointmentDBContext注册了,但错误状态相反。知道我做错了什么吗?


Helenr
浏览 107回答 1
1回答

浮云间

这个问题是缺少注册的,DbContextOption它是初始化目标数据库上下文所需的构造函数的一部分。在内部就是这样RegisterPluginDataContext做的。/// <summary>/// Represents extensions of Autofac ContainerBuilder/// </summary>public static class ContainerBuilderExtensions{    /// <summary>    /// Register data context for a plugin    /// </summary>    /// <typeparam name="TContext">DB Context type</typeparam>    /// <param name="builder">Builder</param>    /// <param name="contextName">Context name</param>    public static void RegisterPluginDataContext<TContext>(this ContainerBuilder builder, string contextName) where TContext : DbContext, IDbContext    {        //register named context        builder.Register(context => (IDbContext)Activator.CreateInstance(typeof(TContext), new[] { context.Resolve<DbContextOptions<TContext>>() }))            .Named<IDbContext>(contextName).InstancePerLifetimeScope();    }}DbContextOptions<TContext>请注意,它在激活上下文时尝试解析。您需要构建数据库上下文选项并将其提供给容器,以便在解析时可以将其注入到上下文中。private const string CONTEXT_NAME ="nop_object_context_bookappointment";public  void Register(ContainerBuilder builder, ITypeFinder typeFinder, NopConfig config) {    //...code removed for brevity    var optionsBuilder = new DbContextOptionsBuilder<BookAppointmentDBContext>();    optionsBuilder.UseSqlServer(connectionStringHere);    DbContextOptions<BookAppointmentDBContext> options = optionsBuilder.Options;    builder.RegisterInstance<DbContextOptions<BookAppointmentDBContext>>(options);     //data context    builder.RegisterPluginDataContext<BookAppointmentDBContext>(CONTEXT_NAME);    //...code removed for brevity}
打开App,查看更多内容
随时随地看视频慕课网APP