如何将类的特定实现传递给Autofac中的泛型
问题描述:
我有一个泛型类EfRepository<>
,它是接口IRepository<>
的实现。该类将DbContext
作为其构造函数的参数。我需要注入一个特定的子类DbContext
,即ApplicationDbContext
。如何在Autofac中做到这一点?如何将类的特定实现传递给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();
答
你不需要做什么特别的,只是登记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而不是直接解析。
您可以在这里找到更多的信息:Passing parameters to register