为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
Helenr 2023-07-09 09:57:28
我有一个带有 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注册了,但错误状态相反。知道我做错了什么吗?
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

这个问题是缺少注册的,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

}

查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信