gpt4 book ai didi

domain-driven-design - DDD : inheritance and transactions

转载 作者:行者123 更新时间:2023-12-04 08:21:07 27 4
gpt4 key购买 nike

我正在试验领域驱动设计和事件溯源。我打算使用(在 C# 中开发)NServiceBus、JOliver 的 EventStore 和 NES 来绑定(bind)它们。我已经拥有适用于一个简单案例的基础架构(一个仅具有值对象的聚合根)。

我正在阅读 Evans 蓝皮书,我正在尝试开发一个简单的领域模型,其中的示例来 self 的工作领域(HVAC 维护公司的 ERP 和 CRM)。

我正在为一个简单的子域建模,即 HVAC 机器及其之间的关系。机器有多种类型,例如熔炉、燃烧器、空调、压缩机、通用部件。每台机器可以有多个子机器。所有机器类型共享一些共同的数据和一些共同的行为。但是每种类型都有额外的数据和特定的行为,例如,您只能将 Burner 对象添加到 Furnace。

我分析的第一个结果是每台机器都应该是一个聚合根(它继承自 NES 中的 AggregateBase),因为它必须可以保存对特定机器的引用(例如插入涉及单个机器的维修记录,故障记录等),还可以减少大型机器树中的并发问题。

因此我的假设如下:

public class Machine : AggregateBase
{
public DateTime InstallationDate { get; private set; }

public Guid ManufacturerId { get; private set; }

public Guid ModelId { get; private set; }
}

public class Furnace : Machine
{
public List<Burner> burners { get; private set; }

// other furnace properties

public void AddBurner(Burner burner)
{
// perform validation
this.Apply<BurnerAdded>(x=> x.burnerAdded = burner);
}

public void Handle(BurnerAdded @event)
{
this.burners.Add(@event.burnerAdded);
}
}

public class Burner : Machine
{
// burner specific properties/methods
}

但我有一些疑问:

  1. 这是表示我的域的正确方法吗?我读到不鼓励类继承,但在我看来这是使用它的完美案例(Burner IS A Machine,Furnace 也是)。我将仅限于一级继承。

  2. 是否可以使用事件溯源实现类继承?特别是提议的技术堆栈(nServiceBus、EventStore、NES)?

  3. 我应该如何执行子机器的添加(例如,燃烧器到熔炉)?这个操作可以分为两部分:

    1. 将新的 Burner 添加到 Burner 存储库。
    2. 将对 Burner 的引用添加到父 Furnace 的 burners 列表中但是这两个操作全局修改两个聚合根,所以操作应该在两个单独的命令处理程序/事务中执行......但是第二个取决于第一个......这是某些建模错误的证据吗?我可以将 nServicebusMessages 批处理在一起以在单个事务中执行操作,但我读到这并不好......

    如果我让子机器引用父机器,父机器会丢失子机器列表(验证需要),我无法查询事件溯源存储库以获取除 Guid 之外的其他属性。

在此先感谢您对讨论的贡献,

最佳答案

对于#1,我会说不。您示例中的聚合根应该是 Furnace(仅)。 Burner 应该建模为 Furnace 上的集合,就像您目前拥有的那样,但不应该是聚合根。我不认为继承本身是一个问题,除了你的刻录机现在是通过继承的聚合根这一事实(因为 Burner => Machine => AggregateBase)。

如果燃烧器仅存在于 Furnaces 上下文中,您可能不需要 Burner 存储库——您将始终向熔炉添加燃烧器。我不清楚创建一个新的刻录机本身是否有趣,是否需要它自己的事件。该问题的答案将决定您是需要这两个事件还是只需要“已添加”事件。

关于domain-driven-design - DDD : inheritance and transactions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14893415/

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