Dependency injection 如何将存储库注入UnitOfWork?

Dependency injection 如何将存储库注入UnitOfWork?,dependency-injection,repository,unit-of-work,Dependency Injection,Repository,Unit Of Work,我已经实现了我的UnitOfWork,以便它保留对所有存储库的引用 public interface IUnitOfWork { void Commit(); void RollBack(); } public interface IMyUnitOfWork : IUnitOfWork { IFooRepository Foos { get; } IBarRepository Bars { get; } // Other repositories ... } 请

我已经实现了我的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
{
}
公共接口IFooRepository:IRepository
{
//FooRepository特定的方法在这里。
}
公共界面IRepository:IRepository
T:在哪里上课
{
}
现在,我如何将这些存储库注入到我的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>()); 
      }
   }
}
公共类ConcreteUnitOfWork:IMyUnitOfWork
{
私有只读IUnityContainer unityContainer;
私有IFooRepository;
公共混凝土工作单元(IUnityContainer unityContainer)
{
this.repositoryFactory=repositoryFactory;
}
公共ifoos
{
得到
{ 
返回此.foo存储库??
(this.fooRepository=unityContainer.Resolve());
}
}
}
我知道将Unity容器传递给UnitOfWork是不正确的,但是您会提供什么模式来解决这个问题

您可能会提到,我不应该将存储库引用保留在UnitOfWork中,但请假设一个需要多个存储库的服务类。通过这种设计,我可以将UnitOfWork作为构造函数参数(构造函数注入)传递给服务类,但是如果我没有将存储库引用保留在UnitOfWork中,我将不得不将所有需要的存储库作为构造函数参数传递,您知道这会导致什么结果

--更新--

如果我完全错了,请告诉我,我不应该用UnitOfWork编写存储库。那么请给我一个关于“构造函数过度注入”的解决方案

--更新2--

从UnitOfWork组合(引用)存储库似乎违反了打开/关闭原则,因为我们需要在添加新存储库(添加新属性)时更改UnitOfWork类


如果我是正确的,我应该考虑重构。你能给我一些想法吗?

目前的设计方案似乎在IMyUnitOfWork界面中混合了多个职责。您说这是因为,否则服务类可能需要独立地获取每个存储库。我想你的意思是这样的:

public MyService(
   IUnitOfWork uow,
   IFooRepository fooRepository,
   IBarRepository barRepository)
在我看来,这是一个更简单、更干净的设计

但是,构造函数过度注入又如何呢


嗯,有一个。。。但问题是,这与您现在在具体的UnitOfWork实现中遇到的问题完全相同。您根本没有解决构造函数的注入气味问题-您只是将它移到了另一个类中

事实上,通过将其转移到具体的工作单元,您已经使处理这种情况变得更加困难。因为ConcreteUnitOfWork是一个纯粹的基础结构类(或者支持类,如果你愿意的话),它没有任何业务上下文,所以很难在这里提出一种解决构造函数的方法

另一方面,一个给定的服务(或者可能是一个控制器)将趋向于更加专业化,并且了解业务上下文,因此它不需要每一个存储库来完成它的工作——或者如果它需要,它可能会尝试做太多的工作


这样一个特定的业务组件可以更好。

“您根本没有解决构造函数的注入气味问题——您只是将其移动到了另一个类中”;你完全正确。