Domain driven design 将对非根实体的引用传递给外部对象几乎没有什么令人困惑的地方

Domain driven design 将对非根实体的引用传递给外部对象几乎没有什么令人困惑的地方,domain-driven-design,Domain Driven Design,根实体可以将对内部实体的瞬时引用传递给外部对象,但前提是操作完成后外部对象不保留该引用 (一) a) 为什么外部对象在单个操作期间具有引用(对内部实体的引用)是可以接受的,但在两个操作期间保持该引用是不可接受的?我的观点是,如果在两个操作的持续时间内保持引用是不好的,那么在一个操作的持续时间内保持引用可能同样是不好的 b) 假设SomeRootEntAggregate root将内部实体SomeIntEnt的瞬时引用传递给外部对象,那么外部对象应该如何请求SomeIntEnt?通过在根上调用特定

根实体可以将对内部实体的瞬时引用传递给外部对象,但前提是操作完成后外部对象不保留该引用

(一)

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

b) 假设
SomeRootEnt
Aggregate root将内部实体
SomeIntEnt
的瞬时引用传递给外部对象,那么外部对象应该如何请求
SomeIntEnt
?通过在根上调用特定方法–例如
SomeRootEnt.Borrowmient(…)
–或者根是否应直接公开内部实体作为其属性(例如
SomeRootEnt.SomeIntEnt

(二)

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

b) 类似地,至少在我的理解中,root也无法强制外部对象在完成单个操作后删除对内部实体的引用

多谢各位

更新:

2a)

这是正确的,这就是为什么最好确保 对象未被修改,但以不变的方式使用。此外, 被传递的实体仍然可以自己维护一定程度的完整性

是否主要由聚合根(部分由传递的实体)或外部对象(接收临时引用)负责确保传递的实体不被修改?如果是后者,那么这个集合的一致性真的不是取决于开发外部对象的人吗

2b)

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

我假设在大多数情况下,当一个操作完成后,外部对象就有责任去掉引用

1a)可能需要对实体的引用来支持域操作,但是该引用应该是暂时的,因为它在操作后不会被保留。它只在手术期间保持,而不是在手术后保持,因此它不能在诱导后保持两次手术。这一点是为了确保将引用传递给外部实体的聚合能够保持对其组成部分的控制。您不希望其内部实体被其他聚合所接管,因为这样就更难对行为进行推理

1b)它可以走任何一条路,这取决于用例。属性只是一种伪装的方法

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

2b)正确,您有责任确保这一点。正如您必须确保给定值对象是不可变的(如果需要),您必须考虑传递的引用的完整性。 这是一个一般性的指导方针,因为它会导致“行为良好”,易于推理,并且易于生成一致的聚合

更新

2a)考虑到编程语言的局限性,聚合保护自身的能力是有限的。因此,需要“人为干预”,特别是在像这样更复杂的情况下。诚然,总量可能会受到另一方的支配,这就是为什么这些指导方针已经到位


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

如果具有私有实体的对象获得锁,将对该实体的引用传递给外部方法,该方法永远不允许将其复制到该方法离开作用域后仍将存在的任何位置,然后释放锁,可以确保当释放锁时,没有外部实体将持有引用。即使锁中的某个代码抛出异常,该不变量也将保持不变。如果允许外部方法将对实体的引用存储在可能比它更长寿的任何地方,即使它承诺其他操作将销毁该引用,那么要确保销毁外部引用所需的操作在释放锁之前实际发生就变得更加困难了。

uhm,看来我错误地更新了你的帖子-我道歉