domain-driven-design - DDD 存储库和工厂

标签 domain-driven-design repository-pattern factory-pattern ddd-repositories

在我的应用程序中有几层。
在本主题中,将重点关注域和基础设施层。

我在域层中有存储库接口(interface) ClientRepositoryInterface。
我在基础设施层实现了这个接口(interface) ClientRepositoryImpl 。

但是要在其存在周期的中间重构对象,我需要工厂(ReconstitutionClientFactory)。
调用工厂将在存储库中。
埃里克埃文斯的书被描述为一种正常的做法。

但是这个工厂(ReconstitutionClientFactory)应该在哪里呢?在域或基础设施层?

我认为在域...
但!但是接下来下层会直接调用上层!
这是错误的,但如何做对呢?

最佳答案

工厂和存储库概念

为了回答您的问题,我认为关注 DDD 定义的概念的责任很重要。

在蓝皮书中,有一个部分处理您描述的问题:

A FACTORY handles the beginning of an object’s life; a REPOSITORY helps manage the middle and the end.



特别是针对您的问题:

Because the REPOSITORY is, in this case, creating objects based on data, many people consider the REPOSITORY to be a FACTORY—indeed it is, from a technical point of view.



(均引自 Evans,第 6 章,“与工厂的关系”一节)

为了保持概念的纯洁性,工厂和存储库的界面必须干净。所以不允许通过存储库接口(interface)创建新的业务对象,也不允许通过工厂接口(interface)查询现有业务对象。

然而,保持接口(interface)干净并不意味着您不应该使用存储库实现中的工厂,因为毕竟存储库会在某些时候创建一个实例,如果该实例创建很复杂,那么工厂是合适的解决方案。

再次引用埃文斯的话:

Whenever there is exposed complexity in reconstituting an object from another medium, the FACTORY is a good option.



但是请注意,存储库很可能会调用工厂上的不同方法,而不是真正想要创建新域对象(而不是重构)的客户端。

埃文斯的书中甚至有一个例子说明了方法:

Domain object reconstitution with help of a factory

回答你的问题

现在很明显这是允许的,让我们关注您将工厂放在哪里的问题:

DDD工厂接口(interface)属于域,因为您的域逻辑使用它来创建域对象。

DDD重构工厂接口(interface)不属于域,因为这仅与您的存储库相关。它在您的域的现实世界中不存在。

现在,如果您使用的架构禁止从域到基础架构的依赖关系(在应用 DDD 时可能应该这样做),很明显 工厂实现属于基础设施 .请注意,无论您是否将图层称为层、环、领域或其他任何名称,依赖关系都是重要的部分。

关于domain-driven-design - DDD 存储库和工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31528368/

相关文章:

nhibernate - 域驱动设计:聚集具有大量集合的根

c# - 为什么 Redis C# 客户端方法 .getById() 返回 null?

domain-driven-design - DDD 中的工厂、服务、存储库

c++ - 插件如何使用 C++ 调用其他插件?

c++ - 使用可变参数模板的工厂模式?

c# - 如何在存储库中的域模型上设置私有(private)字段

java - 命令查询分离模式示例

entity - DDD : where to generate url slug of an entity?

c# - 如何使用 Dapper 实现通用存储库设计模式?

entity-framework-4.1 - 实体和存储库模式与 ninject、Dispose Issue