【问题标题】:DDD repositories, and RESTDDD 存储库和 REST
【发布时间】:2016-06-28 22:45:20
【问题描述】:

DDD 存储库是否应该始终返回聚合及其所有值对象和实体?

例如,我有 Invoice 对象,其中包含它的类型和项目。

Invoice
  --Id
  --Issuer
  --InvoiceType
  --Items

数据保存在 4 个 SQL 表中。

Invoices (FK to invoice type, FK to issuers),
InvoiceTypes
Items(fk to Invoice)
Issuers

如果存储库应始终返回完整状态的聚合,如果我需要获取 50 张发票并仅显示 ID 和 IssuerName,那么包含 InvoiceType 和 Items 是否有点矫枉过正。

示例

InvoiceRepository
{
  //should this also fetch InvoiceTypes and items from SQL, or i need separate invoice model for this
  public List<Invoice> FetchForListing(int page, int take);
}

【问题讨论】:

    标签: domain-driven-design ddd-repositories


    【解决方案1】:

    DDD 存储库是否应该始终返回聚合及其所有值对象和实体?

    没有。在您将要执行写入的用例中,您应该加载所有内容,因为您需要完整的内部状态来确保您的更改满足不变量。

    但是,如果您只打算执行 读取,则完全不需要完整状态 - 限制您提取的数据是合理的。

    (例如:当使用 模式时,读取往往根本不会触及聚合,而是将聚合状态的“投影”中的数据复制到更合适的表示中。)

    InvoiceRepository
    {
        // should this also fetch InvoiceTypes and items from SQL, 
        // or i need separate invoice model for this
        public List<Invoice> FetchForListing(int page, int take);
    }
    

    所以在这种情况下,您不会返回 List&lt;Invoice&gt;,因为这不是您想要的,而且您可能不会使用相同的接口来表示存储库

    InvoiceSummaryRepository
    {
        public List<InvoiceSummary> readSummary(int page, int take);
    }
    

    检查您自己的通用语言以找出实际调用的 InvoiceSummary,以确定 List&lt;InvoiceSummary&gt; 是否实际上是具有自己名称的事物(可能是您正在使用它来构建资源的表示在您的 REST api 中),等等。

    【讨论】:

    • 哦,我明白了。我错误地理解了与聚合相关的存储库。我相信我总是必须返回 Invoice Domain 对象,但实际上它可以是业务需要的任何表示。在这种情况下,InvoiceSummary 是什么?领域模型、实体、值对象?
    • InvoiceSummary 这里只是对您的数据/查询的读取模型 - 不涉及业务规则,所以我不会担心尝试对其应用 DDD 名称
    • 从技术上讲,它可能是一个值对象——这是一个读取用例,因此数据应该是不可变的。我同意@tomliversidge 的观点,这不值得担心。
    • 答案在技术上是正确的。但是,请考虑使命名更加明确。 Repository 应该理想地关注聚合。您可以将读取位命名为 InvoiceQuery。它可以返回任何有用的数据表示,并且永远不应该关注聚合。您可以返回整数表示计数、DTO(如答案),甚至是 .Net 世界中的 dynamicDataRow。但是,是的,理想情况下,这两个概念应该分开。
    • 我同意@EbenRoux 避免过度使用Repository 概念。应用 CQRS 原则时,存储库应该只返回聚合根,而不是查询 DTO。
    猜你喜欢
    • 2013-12-05
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2019-06-26
    相关资源
    最近更新 更多