2013-03-05 101 views
3

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

假设

  • 我已经建立了有我的解决方案中的任何其他 组件没有依赖性为DDD只有一个明确的根 聚集态纯域模型。

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

  • 内部仓库使用EF与 其子

一起坚持的对象。如果避免暴露干将(绝对不是制定者),那么请问我的仓库可以访问该对象的状态为了实际坚持下去。

选项??

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

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

也有是牵引对象出来的反向问题DB。通过构造函数初始化似乎是唯一可能的候选者。

回答

2

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

+0

我可以这样做,但它感觉有点奇怪 – csherriff 2013-03-05 07:12:17

+0

谢谢eulerfx ..进一步阅读后,我认为公共getter /私人setter的想法可能是最好的选择在这里..至少直到我解决如何处理整体EF5无知的事情。老实说,我在推动纯粹的DDD实施方面有点过分..我想它值得明确地思考问题虽然 – csherriff 2013-03-06 01:26:10

1

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

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

这就是说。为了坚持一个对象,你需要它的状态。为了保湿一个物体,你需要提供它的状态。这一点没有办法。如果你的工具需要getter和setters,那就这样吧。

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

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

公共获得者和接受者有些开放滥用,但事实就是这样。

+0

我很高兴使用EF5生成的实体用于持久性目的,因为这些只存在于in我的仓库程序集。我认为如果DDD声称需要纯域名汇编代码,那么他们必须对此问题有一些解决方案。最小侵入性的方法似乎只是将IRepository注入到我的根集合中 – csherriff 2013-03-05 07:08:36