没有getter的DDD对象持久性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有getter的DDD对象持久性相关的知识,希望对你有一定的参考价值。

我想我错过了一些非常明显的东西,但是对于域对象和它们通过存储库的持久性存在很多分歧,因此很难得到明确的答案。

假如说

  • 我已经构建了一个纯域模型,它不依赖于我的解决方案中的任何其他程序集,因为DDD只有一个明确的根聚合。
  • 我有一个特定于域的存储库,用于保存服务层调用的根聚合。
  • 在内部,存储库使用EF来保持对象及其子对象

如果避免暴露getter(绝对不是setter),那么我的存储库如何访问对象的状态以实际持久化它。

选项?

  1. 依赖注入域模型(DDD气味??)
  2. 只有吸气剂(DDD味道??)

还有一个相反的问题是将对象拉出数据库。通过构造函数初始化似乎是唯一可能的候选者。

答案

ORM可以通过反射获取对象内的数据。例如,NHibernate has various access strategies用于允许映射类仅具有没有getter或setter的私有字段的属性。我认为EF应该有类似的设施。

另一答案

正如eulerfx所说:由于你使用的是ORM,你必须使用它提供的东西。

我永远不会心甘情愿地使用ORM,所以我的经验有点受限但似乎是一个问题,因为ORM以某种形式进入对象模型。在某些情况下,它会强制您以特定方式设计类。

话虽如此。为了保持对象,你需要它的状态。为了给物体提供水合作用,你需要为它提供状态。没有办法解决这个问题。如果你的工具需要吸气剂和定型器,那就这样吧。

你可能有一些被你的对象暴露/消耗的状态对象,即使意图稍微清楚一点,它只是移动问题---但它可能更好:)。

即使使用事件源,事件也包含状态,并且必须应用于对象以使其返回到其上一个状态,或者您可以使用与状态对象完全相同的快照。

公共吸气者和制定者有些滥用,但它就是这样。

以上是关于没有getter的DDD对象持久性的主要内容,如果未能解决你的问题,请参考以下文章

DDD - 持久性模型和领域模型

持久性无知和 DDD 现实

DDD 域实体与持久性实体

DDD实战与进阶 - 值对象

高效的AngularJS状态管理和持久性

Hibernate持久化对象