gpt4 book ai didi

c# - EFCore 和 C# 中聚合之间的 DDD 和引用

转载 作者:行者123 更新时间:2023-11-30 12:38:11 25 4
gpt4 key购买 nike

我有一个问题,我不确定在假定 DDD 并使用 C#/EF Core 时如何解决。

简化情况:我们有 2 个聚合 - ItemWarehouse。它们中的每一个都通过 ExternalId(Guid) 来识别它的身份(FE 等),这也被视为它的域身份。它还具有 数据库 Id,用于在数据库模型中标识它 - 实体模型和 Db 模型是同一类,因为 EF Core 允许使用私有(private)字段 - 仅公开 ExternalId 和必填字段。实体(在 DDD 和 EF Core 意义上)包含大量与对象严格耦合的业务逻辑和方法。一般来说,我遵循 eShop/eShopOnContainers 中的模式示例。

Item 被分配给 Warehouse,当创建一个项目时,我们需要将 Warehouse 传递给它的构造函数。

将完整的 Warehouse 对象传递给 Item 的构造函数(以及 Item 定义的其他方法)是否合适:

public Item(Warehouse warehouse,..)

或者我应该只中继数据库 ID :

public Item(long warehouseId,..)

我对此有疑问,因为一方面我读到聚合不应该引用其他聚合,但另一方面使用 Datbase DB 将实现细节(关系数据库中的对象持久性)泄漏到域模型,这不应该在我看来发生了。

使用外部 ID:

public Item(Guid warehouseId,..)

没有解决问题,因为数据库中的实际关系不基于它。

你怎么看?我有点疑惑。

最佳答案

通常您会为聚合根的 Id 创建一个值对象。依赖数据库生成的 Id 是一种可能性。如果您决定让 Db 生成 Id,那么您将需要使用它。但是,为什么您仍然需要传递 Warehouse 引用或 Id?看起来 Item 是一个实体,而 Warehouse 是应该包含该实体的聚合根。通常,您不应在聚合根之外创建实体。

编辑:Vaughn Vernon 在红皮书中描述了几种身份创建策略。其中之一是让诸如 SQL Db 之类的持久化机制生成实体或聚合的唯一标识符。

关于c# - EFCore 和 C# 中聚合之间的 DDD 和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54963663/

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