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);
}
答案 0 :(得分:2)
DDD Repository是否应始终返回聚合及其所有值对象和实体?
没有。在您将要执行写入的用例中,您应该加载所有内容,因为您需要完整的内部状态以确保您的更改满足不变量。
但如果您只是要执行读取,则根本不需要完整状态 - 限制您提取的数据是合理的。
(例如:当使用cqrs模式时,读取往往不会触及聚合,而是将数据从聚合状态的“投影”复制到更合适的表示中。)
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中表示资源,等等。