【发布时间】:2013-02-09 02:41:41
【问题描述】:
• 我们可以通过对象引用来表达两个实体之间的关联(虽然聚合根与其内部实体之间的关系 也可以通过 在根上定义的方法 --> SomeRootEnt.BorrowMeIntEnt(...) )或通过 Repository 表示,这将检索 相关实体 em> 来自数据库。
• 当通过Repository表达关系时,client会直接调用Repository来获取相关实体
• 关于如何表达关系的决定是基于这种关系是否是维护完整性所必需的(也许还取决于行为需要联想才能表达自己)
1) 如果 repository 表示 relationship(比如 1:*),则需要 子实体包含 父实体 的 ID (注意:这个问题假设至少有一个父实体是根,或者它们都位于同一个聚合中)?
2) 不同聚合中的实体之间的关系只能用IDs
表示a) 为什么?
b) 这样的关系难道不是通过Repository来表达的吗?
c) 如果 b) 为“是”,这也表明在大多数情况下,不同聚合中的实体之间的关联 是不需要的为了支持特定的行为?如果是,为什么?
更新:
2a)
表示与身份引用的关系不同于 表示与对象引用的关系。原因是 关系应该用一个身份来表达是为了维持 事务完整性——即只有一个聚合将被修改 在任何给定的交易中。如果使用了对象引用,则两个 聚合可能会受到事务的影响。
我 - 我理解您要表达的观点,因为如果关系将用 对象引用 来表达,那么仅仅是因为聚合 A1(正在修改)是“物理上”连接到另一个聚合 A2,这意味着 A1 的一个部分(即 A2
II - 但是从概念上讲,如果我们修改A1,那么即使两者之间的关系不使用对象引用来表达,两个聚合仍然是不同步的,所以实际上, A1和A2物理连接有什么区别?
III - 无论如何,为什么我们不能在两种情况下都简单地使用最终一致性?
第二次更新:
原始_2)
需要明确的是,根实体 (AR) 之间的关系应该是 用身份来表达。非根实体之间的引用 应该禁止不同的聚合。
我们能否拥有只能从 A1 非根实体 到 A2 根实体 的单向关联(即 非根实体在 A1 中将包含 A2 根的 ID)?
2) 一)
我。
如果使用了对象引用,则两个聚合可能会受到 交易。
它创造了 A2 在事务中被修改的可能性 正在修改 A1。通过身份引用 A2 消除了这一点 可能性。此外,数据库锁定等内容不适用于 A2 加载 A1 时。
暂时忽略在更新 A1 时数据库锁定不适用于 A2 的事实 - 为什么我们不应该在某些情况下允许在单个事务中同时修改 A1 和 A2?
我知道聚合定义了一致性边界,但如果在极少数情况下我们需要 A1 和 A2 在同一个事务中同步,那么只有其他选择可能是将 A1 和 A2 转换为单个聚合,在该特定模型中可能不合适?!
谢谢
【问题讨论】: