【问题标题】:Can AggregateRoot reference another root if same aggregateroot type?如果相同的聚合根类型,AggregateRoot 可以引用另一个根吗?
【发布时间】:2020-06-23 20:09:30
【问题描述】:

我正在建模一个库存应用程序,其中管理项目并将其分组到一个容器中,并分配一个唯一编号,该编号将标识库存实例,并且可以使用仓库中的 RF ID 轻松管理。在这些场景中,一个容器可以容纳另一个或多个容器,这些容器将指向父容器以形成层次顺序或父子关系。所以我的问题是,如果我将容器建模为 AggregateRoot,并通过引用包含一组子容器,它会违反 DDD 规则。处理这种方式的原因是由于交易边界,当子容器通过父 RF ID 扫描移动或添加到父容器时,我可以调整库存移动或管理数量。这是我的示例代码

public class Container:AggregateRoot
{
public virtual string Id{get;protected set;}
public virtual ScanId {get;protected set;}

public List<Container> ChildContainers {get;set;}

public void Detach(Container containerToAttach){

//Todo Adjustments
ChildContainers .Remove(containerToAttach);
}
public void Attach(Container containerToAttach){

//Todo Adjustments
ChildContainers .Add(containerToAttach);
}
}

【问题讨论】:

    标签: c# domain-driven-design aggregateroot


    【解决方案1】:

    如果您真的在处理实体仓库,那么您至少会想听听Greg Young's 关于 DDD 如何在该领域工作的讨论。

    短版:现实世界是记录本;您的数据库只是缓存了该信息的副本。您不会拒绝向您描述真实世界的消息,而是接受新信息(假设来源可靠)并在您的数据表明某些“不变量”被违反时发布升级报告。

    好的,回答你的问题

    1. 不,关于一个聚合根的表示,包括同一类型的不同聚合根的标识符,没有任何违反规则的规定。

    2. 层次结构可能很困难,尤其是当您担心能够跟踪诸如“唯一性”之类的东西时。让子容器包含其父标识符的副本可能比让父容器包含子容器列表更有用。

    3. 通常,我们的聚合并不以我们领域中的名词为中心,而是以关于我们领域中名词的过程为中心。试图将所有信息堆积到一个“The Thing”聚合中是一种常见的错误,因此请注意不要意外重复该错误。

    4. 当您尝试确定一致性边界的归属时,请记住,您从现实世界获得的信息在到达您的域模型时可能只有纳秒级。试图将历史建模为您可以控制的东西是另一种常见的错误。

    【讨论】:

    • 您能否扩展第 3 点,或许举个例子?你的意思是相同的数据位可能是围绕用例建模的不同 AR 的一部分?粗略地说,如果有一个用例可以单独更新 A 和 B,也可以同时更新 A、B 和 C,您可能会有 AR ABABC? AR 基本上是数据锁定,但不会“拥有”数据。
    • @VoiceOfUnreason point#1。我打算通过 ID 引用来引用整个子 AR。你认为这是一个糟糕的设计吗?
    • 简短回答:可能。“聚合是关联对象的集群,我们将其视为数据更改的单位”。当对象属于多个集群时,确保正确的数据更改变得更具挑战性。您需要查找有关“一致性边界”和“事务边界”的讨论,以了解出现的各种问题。
    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 2019-02-13
    • 2013-07-10
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多