Domain driven design 在立面中引用存储库是否正确

Domain driven design 在立面中引用存储库是否正确,domain-driven-design,Domain Driven Design,还是应该始终通过服务方法获取实体 谢谢大部分时间我都在尽可能多地分离我的层。通常我会让我的服务充当业务逻辑的门面。在业务逻辑中,我使用DI容器(如Unity)来解析我的存储库 例如: IUnityContainer container = IoCManager.Container; using (var repository = container.Resolve<IRepository<Token>>()) { return repository.Eagerly

还是应该始终通过服务方法获取实体


谢谢

大部分时间我都在尽可能多地分离我的层。通常我会让我的服务充当业务逻辑的门面。在业务逻辑中,我使用DI容器(如Unity)来解析我的存储库

例如:

IUnityContainer container = IoCManager.Container;
using (var repository = container.Resolve<IRepository<Token>>())
{
    return repository.Eagerly(f => f.Fetch<TokenSetting>(t => t.Settings))
                     .Where(t => t.Value == tokenGuid && t.Expired == null)
                     .FirstOrDefault();
}
IUnityContainer container=IoCManager.container;
使用(var repository=container.Resolve())
{
急切地返回repository.Fetch(f=>f.Fetch(t=>t.Settings))
.Where(t=>t.Value==tokenGuid&&t.Expired==null)
.FirstOrDefault();
}
我的业务逻辑现在在我的基础结构层(存储库)上不包含依赖项。要获得优秀的存储库实现,请查看NCommon。RiteshRao为DDD编写了一些很好的模式使用示例

引用存储库是否错误是主观的。我想DDD纯粹主义者会告诉你很可能是这样。“你想达到多少SoC”才是真正的问题。通常最好通过松耦合来实现高内聚性,但有时这可能会有些过头

希望这有帮助


[编辑]

存储库可以存在于域中。实际上,它们介于业务逻辑/模型和基础架构模型之间。您依赖于接口而不是实现是正确的

看看马丁·福勒的-。在我上面的例子中,我依赖于接口。DI容器解析我的具体存储库类的实际实现。这是一个示例DDD图,我在学习过程中不断改进。

好的,谢谢。但是,存储库接口不是域层的一部分吗?这意味着,如果您使用DI并且只依赖于接口而不依赖于实现,那么您可以在域层中使用存储库(也意味着域服务),这应该是可以的?您完全正确。我已经编辑了我的原始帖子以包含更多细节。您的存储库可以位于域内。需要了解的重要一点是它们的功能,它在您的业务和数据访问层之间进行通信。服务定位器是一种反模式:它不一定是一种反模式。那是一篇有趣的文章,读得很好。我认为主要的一点是,使用服务定位器并不会减轻您的依赖性,而是将它们强制放在定位器上。然而,如果您选择或配置为注入所需的任何内容,大多数DI框架都可以轻松地自动解决依赖关系。使用unity,您可以指定定位器解析具体对象所需的任何依赖项。这就是说,我的层现在不必相互依赖,而是服务定位器,从而使应用程序解耦。使用像Mark这样的抽象工厂可以消除运行时的复杂性,但它现在强制我的应用程序层之间存在依赖关系。域>基础结构,或服务>域,或表示>域等。如果您尝试创建的对象不易变化且可能会更改(即存储库),则我认为使用服务定位器没有问题。