根据 Evans 的说法,在 DDD 中,我们有两种类型的工厂,一种用于创建对象,另一种用于重构存储的对象。
a) 虽然 Creation factories
可以作为 Standalone Factory objects
或定义在聚合根上的 Factory methods
存在,但 Reconstitution Factories
是否应该只作为 Standalone Factory objects
存在?
b) 我认为 Reconstitution Factories
应该只由存储库使用/调用,这会将对象创建委托(delegate)给他们?
c) Reconstitution Factories
是否应该在 domain layer
中定义,即使它们只会被存储库使用?
更新:
我的问题本质上是纯理论的,因为我才开始学习 DDD
是的,它们被持久化到关系数据库中
a)如果我理解正确的话,您是说即使创建特定对象足够复杂,可以使用 creation factory
为其使用 reconstitution factory
,但在大多数情况下,同一对象的重构并不像其创建那么复杂,因此不需要对于 ojit_code ?
b) 您为什么重构比创建更简单的推理是基于存储在 DB 中的对象已经处于有效状态的假设?
我同意
C)
但是根据埃文斯的说法,工厂(我假设他的意思是创建和重组工厂)正在处理领域概念(即他们必须了解他们试图创建/重组的实体或聚合的内部结构),因此是域的一部分(即使它们不代表任何域概念),而数据映射器不是域的一部分,也不了解对象的内部结构?!
谢谢
最佳答案
我假设您的对象保存在 RDBMS 中,而不是保存在 oo db 中。
重构应该始终处于有效状态的已经持久化的对象并不复杂。我将它们视为从 DB 到域对象的简单数据转换(从结果集中获取字段并将其放入对象中,无需任何验证或其他逻辑)。为简单起见,在我看来,基于结果集重建对象的存储库中的方法足以保持存储库的高度内聚性。
如果你真的想走重构工厂的道路(如果你的领域足够复杂需要这样的对象),也许你需要一个合适的 ORM 框架。数据映射对象应该在不同的层中。 域应该不知道数据映射层。 来自 Martin Fowler 的网站:“Repository 还支持在域和数据 mapping layers 之间实现清晰分离和单向依赖的目标。” , link
我认为“重构工厂”是 data mappers,它们应该位于域之外。
关于domain-driven-design - DDD 中的 Reconstitution Factories 和 Repositories 是什么关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20979253/