【问题标题】:Domain Driven Design table lookup and category repository领域驱动设计表查找和类别存储库
【发布时间】:2018-10-16 02:52:18
【问题描述】:

我在数据库中有两个表,Product 和 ProductCategory。

产品包含电视、书籍、食物等单独的物品。 ProductCategory 有各自的类别:电子、办公、杂货等。

在 DDD 中,我的代码是否会选择所有(整个聚合根),并且产品和产品类别是否在同一个聚合根中?

如果它们在同一个 Repository 中,GetAllProduct 和 GetAllProductCategory 会是同一个存储库中的两个不同方法吗?

【问题讨论】:

标签: c# sql-server asp.net-core domain-driven-design


【解决方案1】:

每个存储库应仅包含单一类型的聚合。

您应该根据有界上下文和业务不变量来设计聚合,而不是根据表和数据库。

设计聚合时的一个提示是它们是最大的事务边界。也就是说,聚合内发生的一切都是强一致的。此外,这意味着事务不应跨越多个聚合。如果你需要这个,那么这意味着你没有正确设计你的聚合。

根据我目前在狂野中看到的情况,更重要的是,根据我现在从您的业务中看到的情况(几乎没有!),我会说ProductProductCategory 是单独的聚合,因此它们应该位于不同的存储库中。但为了给你一个明确的答案,我需要知道什么是业务不变量。

【讨论】:

  • 我可以发送更多信息,目前 Producttable 和 Product 表,有外键,所以我认为它们是一个聚合
【解决方案2】:

为了遵循单一职责原则,应该有两个独立的存储库来处理 Product 和 ProductCategory 的数据库交互。

我假设您今天只有 ProductCategory 的 Fetch 方法,但您将来可能需要数据操作。明智的做法是将它们保存在单独的存储库中以进行可扩展的设计。

【讨论】:

  • 好的,出于某种原因,我认为它们在同一个聚合根目录中,因此都在同一个存储库中,谢谢-
  • 这看起来像是每表存储库模式,而不是在 DDD 中使用存储库时的真正意图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多