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

时间:2012-03-12 08:39:57

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

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

2 个答案:

答案 0 :(得分:6)

NhRepositoryFactory不包含业务逻辑,可以成为组合根的一部分。这允许您让它具有对容器的引用。 This is just mechanics并且不被视为服务定位器反模式。 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();

答案 1 :(得分:5)

Autofac还可以在没有工厂的情况下本地处理通用创建。

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

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