DDD中的重建工厂和存储库之间有什么关系?

时间:2014-01-07 18:39:24

标签: domain-driven-design

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

a)虽然Creation factories可以作为Standalone Factory objectsFactory methods在聚合的根目录中定义,但Reconstitution Factories仅应作为Standalone Factory objects存在吗?

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

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

更新

我的问题纯粹是理论性的,因为我只是开始学习DDD

  

我假设你的对象持久存储在一个不在oo db中的RDBMS中。

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

  

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

a)如果我理解正确的话,那么即使特定对象的创建足够复杂而无法使用creation factory,在大多数情况下重建同一个对象并不复杂因为它的创造,因此不需要reconstitution factory

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

  

数据映射对象应位于不同的层中。数据映射   域名

应该是未知的

我同意

c)中

  

我认为“重组工厂”是数据映射器,他们应该这样做   居住在域外。

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

感谢

1 个答案:

答案 0 :(得分:4)

我假设您的对象持久存储在不在oo db中的RDBMS中。

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

如果你真的想要重组工厂的方式(如果你的域很复杂,需要这样的对象),也许你需要一个合适的ORM框架。数据映射对象应位于不同的层中。 域名数据映射层应该是未知的。来自Martin Fowler的网站:“Repository还支持实现域与数据之间的清晰分离和单向依赖的目标{{ 3}}“。 ,mapping layers

我认为“重建工厂”为link,他们应该位于域外。