Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Autofac注入泛型类型工厂_C#_Dependency Injection_Autofac - Fatal编程技术网

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

C# 如何使用Autofac注入泛型类型工厂,c#,dependency-injection,autofac,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

我有一个存储库工厂
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>();  
  }  
}
公共接口IRepositoryFactory
{  
i假定创建(),其中T:实体;
} 
公共类NhRepositoryFactory:IRepositoryFactory
{  
公共IRepository Create(),其中T:实体
{  
返回新的存储库();
}  
}
为了解决某些存储库依赖关系,我想从Autofac容器中获取它们。因此,我应该以某种方式将
Func
工厂注入到我的类中。我如何才能做到这一点?

提前感谢。

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();
//该类是合成根目录的一部分
公共类NhRepositoryFactory:IRepositoryFactory
{
专用只读容器;
公共NHRepository工厂(集装箱)
{
this.container=容器;
}
公共IRepository Create(),其中T:实体
{  
返回此.container.Resolve();
}  
}
您可以这样注册它:

// 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();
builder.Register(c=>newnhrepositoryfactory(c))
.SingleInstance();

Autofac也能够在没有工厂的情况下以本机方式处理通用创建

builder.RegisterGeneric(typeof(NhRepository<>))
    .As(typeof(IRepository<>))
    .InstancePerLifetimeScope();
builder.RegisterGeneric(typeof(NhRepository))
.As(类型(假定))
.InstancePerLifetimeScope();

使用此模式,您只需依赖IRepository,autofac将填写依赖项。

为什么不将autofac容器存储在
NhRepositoryFactory
中?我希望我的工厂是autofac不可知的。它只包含一行代码。你可以把它放在你的作文根里面。它不一定是容器不可知论的。我不明白重点<代码>IRepositoryFactory也通过Autofac解决。你能写下
Create
方法是什么样子的吗?你的问题和答案很相似。我同意以某种方式与Autofac结合似乎是不可避免的。我已经按照你建议的方式做了。不同之处在于我传递了
ILifetimeScope
,而不是
Container
。我更改了实现。我已经用
T Create()
方法创建了
IObjectFactory
接口,该方法使用
ILifetimeScope
创建对象。它由
AutofacObjectFactory
类实现,该类被注入
NhRepositoryFactory
。因此,现在没有自动FAC耦合。在消除重构后,
IRepositoryFactory
。它已经取代了IObjectFactory。我认为这只是一种不好的做法。为什么您要从工厂返回NhRepository,而不是通过构造函数注入将其输入?工厂模式在这里毫无意义。@DmitriyMelnik我可以问最后一个例子吗?我已经这样尝试过了。但当某个类需要几个存储库时,我不得不将它们作为构造函数参数添加。还将为它们中的每一个创建一个字段。这看起来很笨拙,所以我创建了一个工厂。