gpt4 book ai didi

oop - DDD : Address as an aggregate root?

转载 作者:行者123 更新时间:2023-12-04 23:32:19 25 4
gpt4 key购买 nike

我正在努力设计这个系统,其中地址是最核心的信息。现在在这种情况下,地址不仅仅是几行字符串。我们将市政当局(代码、名称)、地区(邮政编码、名称)、街道(代码、名称)、门牌号存储在属于市政当局的特定地区的街道上。这是一个非常规范的方案。

因此,我们拥有相互关联的实体 Municipal、District、Street 和 HouseNumber,为一个人(或其他东西)定义了一个完整的地址。

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

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

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

我真的很想得到你的建议并解决这个问题。任何帮助都感激不尽!

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

需要对一些不变量进行总体管理。例如;一世
在一个区/市的街道上不能有门牌号,其中
邮箱位于另一个不同的区/市。所以在赋值的时候
一个地址/人的邮箱,我需要确保它们在同一个
区。

还有一些一致性边界(如果我理解这个概念
正确的方法)。如果我有地址,这必须有一个地区的门牌号
一条街道(在那个地区)。一条街道可以跨越多个地区,所以它是
确保该街道上的门牌号码正确无误
区。

关于设计聚合的更新:

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

最佳答案

要区分地址是值对象还是实体,请问自己一个问题——如果个人地址发生变化并且第二个人的地址相同——两者都会改变吗?如果它们都发生了变化 - 地址被提升为实体(因为地址身份很重要而不是值(value))。

要区分地址是实体还是聚合根,请问自己一个问题 - 地址本身是否有意义,或者它总是与人相关,通过它修改,与它一起删除?如果它不与人绑定(bind)而是单独存在(在模型中你是在建模而不是现实),那么地址是一个聚合根。

Strictly speaking this aggregate root is not necessary, but if I don’t have it, I would have to traverse many objects to obtain the full address. Does it make any sense to create an aggregate root based on that argument?



不,不是的。技术问题不应该与您的域混淆。实体可以作为“子聚合”工作,地址可以将自治市、城市等结合在一起,但仍然只是一个实体(因为没有人没有意义)。

A person will never reference anything but the aggregate root in this case, however the UI might display only Municipalities (when browsing addresses, etc.). Is this a violation of the aggregate root idea?



演示文稿也不应该与您的域混淆。据我所知 - 如果您只显示实体列表并隐藏它们所属的聚合,那就太好了。

Two persons can be associated to the same address, and if one of them move the other doesn't move automatically.



问题是——你想如何为这个移动过程建模?

我看到了两种方式:
  • 当人 #1 移动时,地址是 修改但人 #2 的地址不是同一个地址,因此 - 不受影响。在这种情况下 - 地址只是一个实体。
  • 当人#1移动时,移动过程开关 地址给另一个人。在这种情况下 - 地址是一个聚合根。

  • Addresses exists on their own and if a person move to an address, he gets associated with it.



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

    请记住 - 没有“模型”,只有“模型”。你不能模拟现实来完美地模仿它,你只能模拟它的一部分到 解决具体问题 .

    这就是为什么很难回答 ddd 相关的问题。
    没有人知道你的问题 你正试图解决。

    If I understand it correctly (http://msdn.microsoft.com/en-us/magazine/dd419654.aspx - the part about aggregates), then whether an address can exist without a person (or other addressee) is irrelevant; the question is whether the address-constituents can exist or be accessed without the address. If they can, Address shouldn't be an aggregate root.



    这是相关的。如果没有人就无法存在地址(这里不是这种情况)-它不可避免地被降级为实体(因为没有人就没有意义)或值对象(如果地址本身没有身份)。否则 - 您只是在引入不必要的聚合根。

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

    关于oop - DDD : Address as an aggregate root?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3241333/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com