5

根实体可以将内部实体的临时引用传递给外部对象,但在操作完成后外部对象不保留该引用的情况下

1)

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

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

2)

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

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

谢谢

更新:

2a)

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

是否主要由Aggregate root(部分由传递的entity)或外部对象(接收瞬态引用)负责确保传递的实体不被修改?如果是后者,那么这个蕴的一致性真的不是由开发外在对象的人摆布吗?

2b)

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

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

4

2 回答 2

3

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

1b)它可以采用任何一种方式,具体取决于用例。属性只是变相的方法。

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

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

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

更新

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

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

于 2013-01-23T18:34:20.377 回答
0

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

于 2014-02-04T21:17:00.450 回答