【发布时间】:2017-05-26 05:49:49
【问题描述】:
问题:什么是最好的、有效的和面向未来的方法? 再水化存储库中的聚合?所提供方法的优缺点是什么?我的看法是否正确?
假设我们有一个聚合根,其中包含私有 setter 和用于访问 state 的公共 getter
行为是通过聚合根上的方法完成的。
指示存储库加载聚合。
目前我看到了几种可能的方法来实现这一点:
- 通过反射设置状态(手动或自动,例如。 自动映射器)
- 制作接受属性以便设置状态的构造函数
- 使用 state object 加载聚合
1) Jimmy Bogard 暗示他的工具 Automapper 不适用于双向映射。但有些人认为我们必须务实,以对您有帮助的方式使用工具。
对我来说,我不喜欢通过反射进行的充分补液。也许 Automapper 存在或聚合根以这样的方式弯曲,可以完成映射(参见他的文章中Vaughn 的一些 cmets)。
2) 创建 构造函数 用于再水化,并带有几个参数,以便以正确的方式对聚合体的状态进行再水化。
这对参数可以扩展(= 新构造函数)或定义可以更改。我喜欢这种方法,除了有一堆参数的部分。
3) state 是聚合根的属性。状态被封装在一个新对象中,该对象由存储库构建,然后提供给聚合根以进行适当的初始化。
有些人认为构建这个状态对象更多工作(新类,在实体和聚合根上公开状态属性以执行业务规则),但它提供了一种初始化状态的干净方法.
假设我们需要事件溯源,状态的加载是否类似于加载事件?状态对象是否提供了一种处理事件的方法?是不是更有未来感?
【问题讨论】:
-
您对“未来证明”的定义是否以某种方式排除了 ORM,或者您是否将它们包含在“反射”中?因为这就是现在有多少人为他们的实体补充水分。
-
我同意@Joseph 的观点:域是事实,不能通过反射改变,所以我们宁愿使用构造函数或状态来补充聚合。
-
“通过反射不可变” - 一切都通过反射可变:) 另外,你并没有真正回答我的问题。
-
@guillaume31:我们有用于未来证明的存储库。如果我们想使用 dapper、ado.net 或其他方式映射到数据存储,我们可以在具体的存储库实现中修复它。但是我们不喜欢通过反射设置状态的想法:)
-
您可能需要准确解释“面向未来”的含义(是关于下一个流行方法还是代码的可维护性?),但我明白您的意思。虽然没有理想的解决方案,因为更改构造函数以适应补水场景也可能会扩大域层的误用范围。
标签: domain-driven-design aggregate automapper