DDD 存储库和 REST

DDD repositories, and REST

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

举个例子,我有一个发票对象,它有它的类型和项目。

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

数据保存在 4 个 SQL 表中。

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

如果存储库应始终 return 在其完整状态下聚合,如果我需要获取 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);
}

Should DDD Repository always return aggregate and all it's value objects and entities?

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

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

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

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);
}

所以在这种情况下,您不会 return List<Invoice>,因为这不是您想要的,并且您可能不会使用相同的界面来表示存储库

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

检查你自己的通用语言,弄清楚 InvoiceSummary 实际上叫什么,确定 List<InvoiceSummary> 是否真的是一个有自己名字的东西(可能是你用它来在您的 REST api) 中构建资源的表示,依此类推。