DDD:地址作为聚合根?

Tom*_*sen 4 oop domain-driven-design aggregate

我正在努力设计这个系统,其中地址是最重要的信息.现在在这种情况下,地址不仅仅是几行字符串.我们将市政当局(代码,姓名),地区(邮政编码,姓名),街道(代码,姓名),门牌号码存放在属于市政的特定区域的街道上.这是一个非常规范化的计划.

因此,我们将实体Municipal,District,Street和HouseNumber各自相互关联,为一个人(或其他人)定义一个完整的地址.

现在我一直在试图找出一个名为Address的聚合根是否有意义?然后,地址实体(聚合根)将引用HouseNumber,Street,District和Municipal.然后一个人将与一个地址相关联.

严格来说,这个聚合根不是必需的,但是如果我没有它,我将不得不遍历许多对象以获得完整的地址.根据该参数创建聚合根是否有意义?

在这种情况下,一个人永远不会引用除聚合根之外的任何东西,但UI可能只显示市政当局(浏览地址时等).这是违反总体根本想法的吗?

我真的很喜欢你的建议并接受这个问题.任何帮助都感激不尽!


关于我的问题的另一个讨论的一点点更新:

需要在聚合中管理一些不变量.例如; 我不能在一个区/市的街道上有一个门牌号,邮政箱位于另一个不同的区/市.因此,在为地址/人员分配邮箱时,我需要确保他们在同一地区.

还有一些一致性边界(如果我理解这个概念的正确方法).如果我有地址,则必须在街道上的一个区(在该区)中有一个门牌号码.街道可以跨越多个区域,因此确保该街道上的门牌号位于正确的区域非常重要.


有关设计聚合的更新:

门牌号实际上是地址的入口点.门牌号码与街道和地区相关联.所以一个人与门牌号码相关联.我还想要定义的是,如果一个人对该门牌号码有"邮政责任".引入聚合根地址,使该人与该关联而不是门牌号.在数据库中,聚合地址将包含与门牌号的1-1关联,并且地址对人员具有1-*.我应该在哪里存储表明该人有邮政责任的价值?我应该在地址汇总中这样做吗?或者你会把它放在哪里?我的实体也是如此 - 我应该在哪里指出该人是否有邮政责任?

Arn*_*psa 8

要区分地址是价值对象还是实体,请问自己一个问题 - 如果人员地址发生变化而第二人有相同的地址 - 是否会改变?如果它们都发生了变化 - 地址被提升为实体(因为地址标识很重要而不是价值).

要区分地址是实体还是聚合根,请问自己一个问题 - 地址是否有任何意义,或者它总是与人有关,通过它修改,与它一起删除?如果它不是与人联系在一起但存在于它自己(在模型中你是建模而不是现实),那么地址就是一个聚合根.


严格来说,这个聚合根不是必需的,但是如果我没有它,我将不得不遍历许多对象以获得完整的地址.根据该参数创建聚合根是否有意义?

不,不是的.技术问题不应该与您的域名混淆.实体可以作为"子集合"工作,地址可以包含市政,城市等,并且仍然只是一个实体(因为它没有任何意义,无人).

在这种情况下,一个人永远不会引用除聚合根之外的任何东西,但UI可能只显示市政当局(浏览地址时等).这是违反总体根本想法的吗?

演示文稿也不应该与您的域名混淆.据我所知 - 如果您只显示实体列表并隐藏它们所属的聚合,那就完全没问题了.


两个人可以关联到同一个地址,如果其中一个人移动,另一个人不会自动移动.

问题是 - 你想如何模拟这个移动过程?

我看到两种方式:

  1. 当#1移动时,地址被修改但是人#2的地址不是相同的地址因此 - 不受影响.在这种情况下 - 地址只是一个实体.
  2. 当#1移动时,移动过程切换到另一个.在这种情况下 - 地址是聚合根.

地址本身存在,如果一个人移动到一个地址,他就会与之相关联.

这意味着您希望坚持第二种方式(当地址是聚合根时).这很好,并没有错,但你应该重新检查地址是否可以降级为实体原因,这会使你的域模型不那么复杂.


请记住 - 没有"模型",只有"模型".你无法模拟现实来完美地模仿它,你只能模拟它的某些部分来解决具体的问题.

这就是为什么回答ddd相关问题很难的原因.
没有人知道你正在努力解决的问题.


如果我理解正确(http://msdn.microsoft.com/en-us/magazine/dd419654.aspx - 关于聚合的部分),那么地址是否可以在没有人(或其他收件人)的情况下存在是无关紧要的; 问题是地址成分是否可以存在或在没有地址的情况下被访问.如果可以,Address不应该是聚合根.

这是相关的.如果地址在没有人的情况下不存在(这不是一个案例) - 它不可避免地被降级为一个实体(因为没有人没有意义)或价值对象(如果地址本身没有身份).否则 - 您只是引入了不必要的聚合根.

如果聚合根包含对其他聚合根(但不包含其他聚合根的实体)的引用,则可以.因此 - 地址成分也可以是聚合根(PostOffice中引用的市政),如果地址本身是实体或聚合根,则不会改变.