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?
没有。在您要执行写入的用例中,您应该加载所有内容,因为您需要完整的内部状态来确保您的更改满足不变量。
但如果您只打算执行 读取,则完全不需要完整状态——限制为您提取的数据是合理的。
(例如:当使用 cqrs 模式时,读取往往根本不会触及聚合,而是将聚合状态的 "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) 中构建资源的表示,依此类推。
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?
没有。在您要执行写入的用例中,您应该加载所有内容,因为您需要完整的内部状态来确保您的更改满足不变量。
但如果您只打算执行 读取,则完全不需要完整状态——限制为您提取的数据是合理的。
(例如:当使用 cqrs 模式时,读取往往根本不会触及聚合,而是将聚合状态的 "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) 中构建资源的表示,依此类推。