use*_*223 6 c# domain-driven-design entity-framework-core
我有一个问题,不确定在假设 DDD 并使用 C#/EF Core 时如何解决。
简化的情况:我们有 2 个聚合 - Item和Warehouse。他们每个人都有自己的身份,通过ExternalId(Guid)来识别它的外部(FE等),这也被视为它的域身份。它还具有在数据库模型中标识它的数据库Id - 实体模型和数据库模型与 EF Core 是同一类,允许使用私有字段 - 仅公开外部 ID 和必需字段。实体(DDD 和 EF Core 意义上的实体)包含大量与对象严格耦合的业务逻辑和方法。一般来说,我遵循eShop/eShopOnContainers示例中的模式。
Item 被分配给 Warehouse,当创建一个 item 时,我们需要将 Warehouse 传递给它的构造函数。
将完整的 Warehouse 对象传递给 Item 的构造函数(以及 Item 定义的其他方法)是否正确:
public Item(Warehouse warehouse,..)
Run Code Online (Sandbox Code Playgroud)
或者我应该仅依赖数据库 ID:
public Item(long warehouseId,..)
Run Code Online (Sandbox Code Playgroud)
我对此有一个问题,因为从一方面我读到聚合不应引用其他聚合,但另一方面使用数据库数据库会将实现细节(关系数据库中的对象持久性)泄漏到域模型,这不应该发生在我的域模型中。观点。
使用外部 ID:
public Item(Guid warehouseId,..)
Run Code Online (Sandbox Code Playgroud)
并不能解决问题,因为数据库中的实际关系并不基于它。
你有什么意见 ?我有点纳闷。
通常您会为聚合根的 ID 创建一个值对象。一种可能性是依赖数据库生成的 ID。如果您决定让 Db 生成 Id,那么您将需要使用它。但为什么您需要传递仓库参考或 ID 呢?看起来 Item 是一个实体,而 Warehouse 是应该包含该实体的聚合根。一般来说,您不应在聚合根之外创建实体。
编辑:正如沃恩·弗农(Vaughn Vernon)在红书中描述的那样,有几种身份创建策略。其中之一是让持久性机制(例如 SQL Db)生成实体或聚合的唯一标识符。