5

我认为我遗漏了一些非常明显的东西,但是在域对象及其通过存储库的持久性方面存在很多分歧,因此很难得到明确的答案。

假如说

  • 我已经构建了一个纯域模型,它不依赖于我的解决方案中的任何其他程序集,因为 DDD 状态只有一个明确的根聚合。

  • 我有一个特定于域的存储库,它保存由服务层调用的根聚合。

  • 在内部,存储库使用 EF 将对象及其子对象持久化

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

选项??

  1. 依赖注入到域模型中(DDD 味道??)

  2. 仅吸气剂(DDD 气味??)

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

4

2 回答 2

2

ORM 可以通过反射获取对象内部的数据。例如,NHibernate 有各种属性访问策略,允许映射类只有私有字段,没有 getter 或 setter。我认为英孚应该有类似的设施。

于 2013-03-05T03:24:51.697 回答
2

正如 eulerfx 所说:由于您使用的是 ORM,因此您必须使用提供的内容。

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

话虽如此。为了持久化一个对象,你需要它的状态。为了水合一个对象,您需要为其提供其状态。只是没有办法解决这一点。如果您的工具需要 getter 和 setter,那就这样吧。

您可能有一些状态对象被您的对象暴露/消耗,即使意图更清晰,它也只是解决了问题 --- 但它可能更好:)。

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

公共 getter 和 setter 有点容易被滥用,但事实就是如此。

于 2013-03-05T04:22:23.157 回答