如何将类的特定实现传递给Autofac中的泛型

时间:2017-04-13 05:13:55

标签: c# autofac

我有一个泛型类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();

1 个答案:

答案 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