如何将类的特定实现传递给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(); 

你不需要做什么特别的,只是登记ApplicationDbContextDbContext

builder.RegisterGeneric(typeof(EfRepository<>)) 
     .As(typeof(IRepository<>)); 
builder.Register<ApplicationDbContext>() 
     .As<DbContext>(); 

如果你想注册一个具体的DbContextEfRepository<>你可以使用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