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

本文关键字:工厂 泛型类型 注入 何使用 Autofac | 更新日期: 2023-09-27 18:27:40

我有一个存储库工厂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>();  
  }  
}

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

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

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>>();
    }  
}

你可以这样注册:

builder.Register<IService>(c => new NhRepositoryFactory(c))
    .SingleInstance();

Autofac还能够在没有工厂的情况下以本机方式处理泛型创建。

builder.RegisterGeneric(typeof(NhRepository<>))
    .As(typeof(IRepository<>))
    .InstancePerLifetimeScope();

使用此模式,您可以简单地获取对IRepository的依赖项,autofac将填充依赖项。