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

use*_*291 5 domain-driven-design

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

1)

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

b)假设SomeRootEnt 聚合根内部实体的瞬时引用 传递SomeIntEnt外部对象,外部对象应该如何请求SomeIntEnt?通过在上调用特定方法- 例如SomeRootEnt.BorrowMeIntEnt(...)- 或者root应该直接暴露内部实体作为其属性(例如SomeRootEnt.SomeIntEnt)?

2)

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

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

谢谢

更新:

图2a)

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

它主要是Aggregate root(部分是通过实体)还是外部对象(接收瞬态引用)的责任,以确保不修改传递的实体?如果是后者,那么这个聚合的一致性是不是真的受到了开发外部对象的人的摆布?

图2b)

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

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

eul*_*rfx 3

1a) 可能需要对实体的引用来支持域操作,但是该引用应该是暂时的,因为它在操作后不会被保留。它仅在操作期间保持,而不是在操作之后,因此它不会通过归纳得出它可以保持两次操作。这样做的目的是确保将引用传递给外部实体的聚合可以保持对其组成部分的控制。您不希望其内部实体被其他聚合接管,因为这样就更难以推理行为。

1b) 两种方式都可以,具体取决于用例。属性只是一种伪装的方法。

2a)这是正确的,这就是为什么最好确保传递的对象不被修改,而是以不可变的方式使用。而且,被传递的实体本身仍然可以保持一定程度的完整性。

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

其中大部分是一般准则,因为它会导致“行为良好”,易于推理,并且易于做出一致的聚合。

更新

2a) 鉴于编程语言的局限性,聚合的自我保护能力也受到限制。因此,需要“人为干预”,尤其是在像这样更复杂的场景中。确实,总量可能会受到另一个因素的支配,这就是制定这些指导方针的原因。

2b) 是的。外部对象可以使用另一个聚合的内部实体,但是它的引用应该是瞬态的 - 这意味着它不是持久的。