我有一个存储库工厂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>>
工厂注入我的班级。我怎样才能做到这一点?
提前谢谢。
答案 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将填写依赖项。