如何使用Autofac注入泛型类型的工厂

Dmi*_*nik 5 c# dependency-injection autofac

我有一个存储库工厂 NhRepositoryFactory

public interface IRepositoryFactory  
{  
  IRepository<T> Create<T>() where T: Entity;  
} 

public class NhRepositoryFactory: IRepositoryFactory  
{  
  public IRepository<T> Create<T>() where T : Entity  
  {  
    return new NhRepository<T>();  
  }  
}
Run Code Online (Sandbox Code Playgroud)

为了解决一些存储库依赖关系,我想从Autofac容器中获取它们.所以我应该以某种方式将Func<IRepository<T>>工厂注入我的班级.我怎么能做到这一点?
提前致谢.

Ste*_*ven 6

它不NhRepositoryFactory包含业务逻辑,可以成为组合根的一部分.这允许您让它具有对容器的引用.这只是机制,不被认为是服务定位器反模式.该 NhRepositoryFactory会是这样的:

// This class is part of your composition root
public class NhRepositoryFactory : IRepositoryFactory  
{
    private readonly Container container;

    public NhRepositoryFactory(Container container)
    {
        this.container = container;
    }

    public IRepository<T> Create<T>() where T : Entity  
    {  
        return this.container.Resolve<NhRepository<T>>();
    }  
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样注册:

builder.Register<IService>(c => new NhRepositoryFactory(c))
    .SingleInstance();
Run Code Online (Sandbox Code Playgroud)


Dan*_*elg 5

Autofac还能够在没有工厂的情况下本地处理通用创建.

builder.RegisterGeneric(typeof(NhRepository<>))
    .As(typeof(IRepository<>))
    .InstancePerLifetimeScope();
Run Code Online (Sandbox Code Playgroud)

使用此模式,您可以简单地依赖IRepository,autofac将填充依赖项.

  • 我已经尝试过这种方式。但是,当某个类需要几个存储库时,我必须将它们添加为构造函数参数。还应为每个字段创建一个字段。看起来很笨拙,所以我创建了一家工厂。 (2认同)