gpt4 book ai didi

domain-driven-design - 加载聚合对域事件的 react

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

我正在实现一个具有领域驱动设计和事件溯源的应用程序。我将所有域事件存储在 SQL Server 的 DomainEvents 表中。

我有以下聚合:

- City
+ Id
+ Enable()
+ Disable()

- Company
+ Id
+ CityId
+ Enable()
+ Disable()

- Employee
+ Id
+ CompnayId
+ Enable()
+ Disable()

每个都封装了自己的领域逻辑和不变量。我将它们设计为单独的聚合,因为一个城市可能有数千(也许更多)公司,而且公司也可能有非常多的员工。如果这些实体属于同一个聚合,我必须将它们一起加载,这在大多数情况下是不必要的。

调用 Enable 或 Disable 将产生域事件(例如 CityEnabledCompanyDisabledEmployeeEnabled)。这些事件包含启用或禁用实体的主键。

现在我的问题是一个新要求迫使我在启用/禁用城市时启用/禁用所有相关公司。如果启用/禁用公司,员工也需要同样的条件。

在我的事件处理程序中,如果例如 CityDisabled 发生,它会被调用我需要为属于该城市的每个公司执行 DisableCompanyCommand

但我怎么知道哪些公司会受到该变化的影响?

我的想法:

  1. 查询事件存储是不可能的,因为我不能使用像 'where CityId = event.CityId' 这样的条件

  2. 让父级知道其子级 ID,并将所有子级 ID 放入父级生成的每个事件中。这也是一个坏主意,因为事件创建者不应该关心以后谁会使用这些事件。因此只有属于正在发生的事件的信息才应该在事件中。

  3. 为每个公司执行 DisableCompanyCommand。只有具有匹配 CityId 的公司才会更改其状态。即使我会异步执行此操作,它也会产生巨大的开销,让每个公司都对这些事件产生负担。此外,对于每家被禁用的公司,都应重复相同的程序以禁用所有用户。

  4. 创建读取模型,将 ParentId 映射到 ChildId,并根据事件中的 parentId 加载 childId。这听起来像是最合适的解决方案,但问题是,在禁用现有公司的同时,我如何知道是否创建了新公司?

我对上述任何解决方案都不满意。基本上,问题是确定已发生事件的受影响聚合。

也许您有更好的解决方案?

最佳答案

您所描述的可以通过 Saga/Process manager 解决监听 CityDisabled 事件。然后它找到该 City 中所有 CompaniesCompanyIds(通过使用现有的 Read 模型 或维护一个CityIdsxCompanyIds) 的私有(private)状态,并向每个状态发送一个 DisableCompany 命令。

这同样适用于 CompanyDisabled 事件,关于禁用 Employee

附言禁用城市/公司/员工对我来说似乎是 CRUD,这些似乎不是来自普通无处不在的语言的术语,它不是很 DDD-ish 但我认为你的设计在这方面是正确的问题。

关于domain-driven-design - 加载聚合对域事件的 react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46848193/

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