gpt4 book ai didi

dependency-injection - 如何将存储库注入(inject) UnitOfWork?

转载 作者:行者123 更新时间:2023-12-04 08:22:39 25 4
gpt4 key购买 nike

我已经实现了我的 UnitOfWork,以便它保留对所有存储库的引用。

public interface IUnitOfWork
{
void Commit();
void RollBack();
}

public interface IMyUnitOfWork : IUnitOfWork
{
IFooRepository Foos { get; }
IBarRepository Bars { get; }
// Other repositories ...
}

请注意,存储库实现了通用类型的存储库接口(interface)。

public interface IFooRepository : IRepository<Entities.Foo>
{
// FooRepository specific methods goes here.
}

public interface IRepository<T> : IRepository
where T : class
{
}

现在如何将这些存储库注入(inject)我的 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 作为构造函数参数(构造函数注入(inject))传递给服务类,但是如果我没有在 UnitOfWork 中保留存储库引用,我将不得不将所有需要的存储库作为构造函数参数传递,你知道吗它导致。

-- 更新--

如果我完全错了请告诉我,我永远不应该在 UnitOfWork 中编写存储库。那么请在这里给我一个关于“Constructor Over-injection”的解决方案。

-- 更新2--

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

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

最佳答案

似乎当前的设计提案将不止一种职责混合到 IMyUnitOfWork 接口(interface)中。您说这是因为否则服务类可能需要独立获取每个存储库。我假设你的意思是这样的:

public MyService(
IUnitOfWork uow,
IFooRepository fooRepository,
IBarRepository barRepository)

在我看来,这是一个更简单、更清晰的设计。

但是构造函数过度注入(inject)呢?

好吧,就是这样……但问题是,这与您现在在 ConcreteUnitOfWork 实现中遇到的问题完全相同。您根本没有解决构造函数过度注入(inject)的问题 - 您只是将它移到了另一个类。

实际上,通过将其移动到 ConcreteUnitOfWork,您已经难以处理这种情况。因为 ConcreteUnitOfWork 是一个纯粹的基础设施类(或者支持类,如果你愿意的话)它没有任何业务上下文,所以很难在这里提出解决构造函数过度注入(inject)气味的方法。

另一方面,给定的服务(或者可能是 Controller )往往更专业并且了解业务上下文,因此它不需要每个存储库来执行它的工作 - 或者如果它做了,它可能试图做太多。

这样一个特定的业务组件最好是refactored to a Facade Service .

关于dependency-injection - 如何将存储库注入(inject) UnitOfWork?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11791467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com