我有一个泛型类EfRepository<>
,它是接口IRepository<>
的实现。该类将DbContext
作为其构造函数的参数。我需要准确注入DbContext
的特定子类,即ApplicationDbContext
。如何在Autofac中执行此操作?
这就是我拥有的,也是我想要的:
builder.RegisterGeneric(typeof(EfRepository<>))
.As(typeof(IRepository<>))
.InstancePerDependency();
//The following line doesn't even compile but perhaps it can make my question clearer
builder.Register(c => new EfRepository<>(new ApplicationDbContext()))
.As(typeof(EfRepository<>))
.InstancePerDependency();
答案 0 :(得分:2)
您不需要做任何特别的事情,只需将ApplicationDbContext
注册为DbContext
builder.RegisterGeneric(typeof(EfRepository<>))
.As(typeof(IRepository<>));
builder.Register<ApplicationDbContext>()
.As<DbContext>();
如果您想为DbContext
注册特定EfRepository<>
,可以使用WithParameter
方法
builder.RegisterGeneric(typeof(EfRepository<>))
.As(typeof(IRepository<>))
.WithParameter((pi, c) => pi.ParameterType == typeof(DbContext),
(pi, c) => c.ResolveNamed<DbContext>("application"));
builder.Register<ApplicationDbContext>()
.Named<DbContext>("application");
我使用命名注册来使Autofac
instanciation受益,而不是直接的isananciation。
您可以在此处找到更多信息:Passing parameters to register