【问题标题】:What is the relationship between Reconstitution Factories and Repositories in DDD?DDD 中重构工厂和存储库之间的关系是什么?
【发布时间】:2014-01-07 18:39:23
【问题描述】:

根据 Evans 的说法,在 DDD 中我们有两种类型的工厂,一种用于创建对象,另一种用于重构存储的对象。

a) 虽然Creation factories 可以作为Standalone Factory objects 或在聚合根上定义的Factory methods 存在,但Reconstitution Factories 是否应该仅作为Standalone Factory objects 存在?

b) 我假设 Reconstitution Factories 应该只由存储库使用/调用,这会将对象创建委托给它们?

c) Reconstitution Factories 是否应该在 domain layer 中定义,即使它们只会被存储库使用?

更新:

我的问题本质上是纯理论的,因为我才开始学习 DDD

我假设您的对象保存在 RDBMS 中,而不是 oo db 中。

是的,它们被持久化到关系数据库中

我认为它们是从数据库到域对象的简单数据转换 (从结果集中获取字段并将其放入对象中,无需任何 验证或其他逻辑)

a) 如果我理解正确,您的意思是,即使创建特定对象足够复杂,可以使用 creation factory,但在大多数情况下,相同对象的重构并不像它那样复杂创建,因此不需要reconstitution factory

b) 你为什么重构不如创建复杂的推理是基于存储在 DB 中的对象已经处于有效状态的假设?

数据映射对象应该在不同的层。数据映射 层应该是域未知的

我同意

c)

我认为“重组工厂”是数据映射器,它们应该 驻留在域外。

但根据 Evans 的说法,工厂(我假设他的意思是创建工厂和重构工厂)正在处理领域概念(即,他们必须了解他们试图创建/重构的实体或聚合的内部结构)因此是领域的一部分(即使它们不代表任何领域概念),而数据映射器不是领域的一部分,也不知道对象的内部结构?!

谢谢

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

    我假设您的对象保存在 RDBMS 中而不是 oo db 中。

    应该始终处于有效状态的已持久化对象的重构并不复杂。我将它们视为从数据库到域对象的简单数据转换(从结果集中获取字段并将其放入对象中,无需任何验证或其他逻辑)。为简单起见,在我看来,存储库中基于结果集重建对象的方法足以使存储库保持高度内聚。

    如果你真的想走重构工厂的路(并且如果你的领域足够复杂以至于需要这样的对象),也许你需要一个合适的 ORM 框架。数据映射对象应该在不同的层。 域应该不知道数据映射层。来自 Martin Fowler 的网站:“Repository 还支持实现域和数据 mapping layers 之间的干净分离和单向依赖的目标。 " , link

    我认为“重组工厂”为data mappers,它们应该驻留在域之外。

    【讨论】:

    • a) 是的,这是真的。如果您设计您的数据库来重新编码您的域(1 个表 1 对象,但在 rdbms 中更难但并非不可能),那么重构对象会更容易
    • b) 是的,我使用创建工厂来为新创建的对象强制执行有效状态。重组工厂不需要重做这项艰苦的工作。重构工厂最困难的工作是将 db 数据映射到域对象。
    • @bckpwrld c) 重构工厂将只有一个简单的域对象概念。他们只需要知道域对象有一些属性,仅此而已。他们不需要知道它的行为,只需要知道属性,这样他们就可以映射数据。与应用程序代码一样,即使是应用程序层中的应用程序代码也可以知道域对象具有哪些属性。创建工厂需要知道什么是有效状态,并且 repos 作为域和映射器之间的桥梁,与域更相关(repos 保存持久对象)位于域中。
    • 将存储库视为域对象集合的持有者。他们可以使用任何数据源模式。如果您将 DAL(映射器,表网关)注入到存储库中,很明显存储库最终将提供对持久化所需对象的访问。
    • @bckpwrld 是的,因为您必须检查状态在该域上下文中是否有效。但是你永远不应该有无效的持久域对象。为什么要将无效对象存储在内存中?此外,如果您将数据管理更改为 OODB,则数据映射器将毫无用处。这就是为什么您需要一个与域相关联的存储库(另一个抽象层)和一个与数据管理系统相关联的 DAL(映射器、活动记录、表网关等)。
    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多