DDD存储库和REST

时间:2016-06-28 14:26:37

标签: domain-driven-design ddd-repositories

DDD Repository是否总是返回聚合及其所有值对象和实体?

例如,我有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);
}

1 个答案:

答案 0 :(得分:2)

  

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

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

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

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

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<Invoice>,因为这不是您想要的,并且您可能不会使用相同的接口来表示存储库

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

检查自己无处不在的语言,找出实际调用InvoiceSummary的内容,以确定List<InvoiceSummary>实际上是否具有自己的名称(可能是你用它来构建在REST api中表示资源,等等。