我已经实现了我的 UnitOfWork,以便它保留对所有存储库的引用。
public interface IUnitOfWork
{
void Commit();
void RollBack();
}
public interface IMyUnitOfWork : IUnitOfWork
{
IFooRepository Foos { get; }
IBarRepository Bars { get; }
// Other repositories ...
}
请注意,存储库实现了通用类型的存储库接口。
public interface IFooRepository : IRepository<Entities.Foo>
{
// FooRepository specific methods goes here.
}
public interface IRepository<T> : IRepository
where T : class
{
}
现在如何将这些存储库注入我的 UnitOfWork。当然,我希望它们具有延迟加载行为。例如:
public class ConcreteUnitOfWork : IMyUnitOfWork
{
private readonly IUnityContainer unityContainer;
private IFooRepository fooRepository;
public ConcreteUnitOfWork(IUnityContainer unityContainer)
{
this.repositoryFactory = repositoryFactory;
}
public IFooRepository Foos
{
get
{
return this.fooRepository ??
(this.fooRepository = unityContainer.Resolve<IFooRepository>());
}
}
}
我知道将 Unity 容器传递给 UnitOfWork 是不正确的,但你会提供什么模式来解决这个问题?
您可能会提到我不应该在 UnitOfWork 中保留存储库引用,但请假设一个需要多个存储库的服务类。通过这种设计,我可以将 UnitOfWork 作为构造函数参数(构造函数注入)传递给服务类,但是如果我没有在 UnitOfWork 中保留存储库引用,我将不得不将所有需要的存储库作为构造函数参数传递,你知道什么它导致。
- 更新 -
如果我绝对错了,请告诉我,我永远不应该在 UnitOfWork 中编写存储库。那么请在这里给我一个关于“构造函数过度注入”的解决方案。
-- 更新 2 --
似乎从 UnitOfWork 组合(引用)存储库打破了开放/封闭原则,因为我们需要在添加新存储库(添加新属性)时更改 UnitOfWork 类。
如果它是正确的,那么我应该考虑重构。你能给我一些想法吗?