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我可以问最后一个例子吗?我已经这样尝试过了。但当某个类需要几个存储库时,我不得不将它们作为构造函数参数添加。还将为它们中的每一个创建一个字段。这看起来很笨拙,所以我创建了一个工厂。