C# 在共享某个实体时标识聚合?

C# 在共享某个实体时标识聚合?,c#,domain-driven-design,domain-model,C#,Domain Driven Design,Domain Model,假设我们有一个简单的数据结构: 接口和网络打印机都有端点,存储在不同的表中(强制使用FKs)。例如,接口要求端点的端口号在:1000-2000之间,网络打印机要求端口号在:2000-3000之间。这让我认为,EndPoint不能是聚合根,因为我们实际上不需要直接访问它,也不希望在不知道其上下文的情况下直接更改端点值。Per:如果某个内容属于一个聚合,那么其他聚合可能会将其作为只读数据引用。是否意味着端点不能属于接口和网络打印机?或者它仍然可以,就像在我的例子中一样,相同的端点实例永远不会在两个聚

假设我们有一个简单的数据结构:


接口
网络打印机
都有
端点
,存储在不同的表中(强制使用FKs)。例如,
接口
要求
端点的
端口号在:1000-2000之间,
网络打印机
要求端口号在:2000-3000之间。这让我认为,
EndPoint
不能是聚合根,因为我们实际上不需要直接访问它,也不希望在不知道其上下文的情况下直接更改端点值。Per:如果某个内容属于一个聚合,那么其他聚合可能会将其作为只读数据引用。是否意味着
端点
不能属于
接口
网络打印机
?或者它仍然可以,就像在我的例子中一样,相同的
端点
实例永远不会在两个聚合之间共享。所以
接口
网络Pritner
总是更新自己的
端点
,不会发生一致性冲突?听起来不错?

您没有解释您的域,但对我来说,
端点
听起来根本不像一个实体,而是一个值(不可变)。更改端点只需将整个旧的
端点
值替换为新值即可。不可变值可以在聚合实例之间共享而不会出现问题,因为它们不能更改


尽管如此,如果端点必须是一个实体,那么只要实例不在聚合中共享就可以了。在多个聚合中使用相同类型的实体没有限制。

您没有解释您的域,但对我来说,
端点听起来根本不像实体,而是一个值(不可变)。更改端点只需将整个旧的
端点
值替换为新值即可。不可变值可以在聚合实例之间共享而不会出现问题,因为它们不能更改


尽管如此,如果端点必须是一个实体,那么只要实例不在聚合中共享就可以了。在多个聚合中使用相同的类型的实体没有限制。

谢谢,听起来有些东西仍然可以表示为ValueObject,即使它实际存储在带有ID字段的表中。ID只是没有在域级别公开?@Tenek您不能简单地将数据放在同一个表中吗?我的意思是,你可以有一个专用的端点表,即使它是一个值,但从持久性模型的角度来看,它将是一个实体,从模型的角度来看,它将是一个值(很可能是一个隐藏的ID)。数据来自遗留数据库。现在端点表是从3个不同的位置引用的,但值永远不会共享。我将为域对象创建隐藏的Id字段,甚至根本不使用它,因为存储库可以从其上下文中查找端点。将端点作为值对象有助于避免暴露其存储库并简化整个结构。谢谢你的建议!谢谢,听起来有些东西仍然可以表示为ValueObject,即使它实际上存储在带有ID字段的表中。ID只是没有在域级别公开?@Tenek您不能简单地将数据放在同一个表中吗?我的意思是,你可以有一个专用的端点表,即使它是一个值,但从持久性模型的角度来看,它将是一个实体,从模型的角度来看,它将是一个值(很可能是一个隐藏的ID)。数据来自遗留数据库。现在端点表是从3个不同的位置引用的,但值永远不会共享。我将为域对象创建隐藏的Id字段,甚至根本不使用它,因为存储库可以从其上下文中查找端点。将端点作为值对象有助于避免暴露其存储库并简化整个结构。谢谢你的建议!