【问题标题】:How to manage the entity which have collection of child entities in DDD?如何管理 DDD 中包含子实体集合的实体?
【发布时间】:2022-06-10 17:34:57
【问题描述】:

游戏场地包含一系列机器和设施

playArena : 
  guid : GUID
  name : string
  location: Location
  owner: string
  amenities: Amenities
  playing_machines: PlayingMachines


Amenities is list of  Amenity -> Array<Amenity>
PlayingMachines is list of PlayingMachine ->  Array<PlayingMachine>

最初的用例可能不会填充太多可以分配的业务逻辑,但是随着应用程序使用和反馈的增加,将会有。我知道它违反了 YAGNI/KISS,但是预测在不久的将来会发生变化,尽管目前的用例可能感觉就像 CRUD 应用程序一样简单。

目前的基本用例是

  • 游乐场应至少有 1 台机器,并且设施是可选的。
  • 竞技场所有者可以更新竞技场、机器和设施。
  • 所有者可以添加、更新或删除机器。
  • 业主可以添加、更新或删除设施。
  • 所有者可以更改竞技场的其他属性。
  • **Play arena 有机器列表,一台机器可以属于多个 Play Arena。它的 m-n 关系 **

这些用例似乎没有太多业务逻辑,或多或少只是 CRUD。

我怎样才能仍然使用 DDD 并实施这些更改。 我应该允许直接使用他们自己的存储库添加、更新和删除机器和设施,还是将 arena 作为聚合根并仅通过 arena 存储库传递任何更改。

第二种情况: 假设只有机器被改变了,我们还需要打电话吗 arenaRepo.updated(arena) -> 并更新所有属性,即使只更改了机器。

第一种情况: 我可以调用getAllMachinesByArenaId():查看哪些是现有机器,哪些是新机器,并通过调用machineRepository.save(udpatedMachines).直接更新数据库(一种upsert操作)

【问题讨论】:

  • 游乐场和游戏站有区别吗?
  • 不,他们是一样的,已经更新了问题。

标签: domain-driven-design ddd-repositories aggregateroot


【解决方案1】:

我怎样才能仍然使用 DDD 并实施这些更改。我应该允许吗 直接与他们的机器和设施添加、更新和删除 拥有存储库或将站点作为聚合根并传递任何更改 仅通过站存储库。

在您的域中,如果机器和设施可以在不处于游戏场所的情况下生存,那么是的,它们必须是它们自己的聚合根(在您的情况下,它还会导致为每个设备创建一个存储库以确保持久性)。

如果不是,那么它们的生命周期应仅由游戏场所管理(在类中实例化,没有单独的存储库)。

据我所知,play arena 无论如何都是聚合根。


对于第二种情况:假设只有机器发生了变化,我们还需要调用吗 arenaRepo.updated(arena) -> 并更新所有属性,即使 只有机器被改变了。

如果机器不是聚合根,那么可以(无论如何您都不会拥有机器存储库)。大多数 ORM 会注意到只有机器集合发生了变化,并且只会更新必要的表/列。


在第一种情况下:我可以调用 getAllMachinesByArenaId():查看哪些是 现有机器,哪些是新机器,直接更新 通过调用 machineRepository.save(udpatedMachines) 来创建数据库。 (一个 一种upsert操作)

如果机器是聚合根,请在创建后通过相应的存储库保存它们。无需致电getAllMachinesByArenaId(),因为他们无需担心被聚集在竞技场内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多