将对非根实体的引用传递给外部对象几乎没有什么令人困惑的事情

时间:2013-01-23 17:50:03

标签: domain-driven-design

根实体可以将对内部实体的瞬态引用传递给外部对象,但条件是外部对象在操作完成后不要保留该引用

1)

a)为什么外部对象在单个操作的持续时间内具有引用(到内部实体)是可接受的,但是不能接受它在两个操作的持续时间内参考该参考?我的观点是,如果在两次操作的持续时间内保持参考是不好的,那么在一次操作的持续时间内坚持它可能同样糟糕吗?!

b)假设SomeRootEnt 聚合根内部实体的暂时引用 SomeIntEnt传递给外部对象,应外部对象请求SomeIntEnt?通过在 root 上调用特定方法 - 例如SomeRootEnt.BorrowMeIntEnt(...) - 或 root 应将内部实体直接公开为属性(例如SomeRootEnt.SomeIntEnt)?

2)

a)假设SomeRootEnt root 将对内部实体 SomeIntEnt的引用传递给外部对象,其中转而对SomeIntEnt进行一些修改,然后这并不意味着 root 无法在这些修改上应用适当的不变逻辑(即 root 无法检查修改后的SomeIntEnt的完整性?

b)同样,至少我的理解是, root 也无法强制外部对象删除对内部实体的引用完成单一操作后?

谢谢

更新

2a)

  

这是正确的,这就是为什么最好确保通过   对象未被修改,但以不可变的方式使用。而且,   通过实体仍然可以保持一定程度的完整性。

主要由聚合根(部分通过传递实体)或外部对象(接收<< em>瞬态参考)以确保传递的实体不被修改?如果是后者,那么这个聚合的一致性是不是真的受制于外部对象的人的摆布?

2b)

  

正确,您有责任确保这一点。就像你一样   必须确保给定值对象是不可变的(如果需要)你   必须考虑传递的参考文献的完整性。

我认为在大多数情况下,一旦操作完成,外部对象的责任就是摆脱引用?

1 个答案:

答案 0 :(得分:0)

如果具有私有实体的对象获取锁定,则将对该实体的引用传递给外部方法,该方法在该方法离开范围之后永远不允许将其复制到仍将存在的任何位置 ,然后释放锁,可以肯定当释放锁时,没有外部实体会持有引用。即使代码中某处的代码抛出异常,该不变量也将保持不变。如果允许外部方法在任何可能超过它的地方存储对实体的引用,即使它承诺某些其他操作会破坏该引用,也很难确保破坏外部引用所必需的操作实际发生在释放锁之前。