我正在嘗試理解 DDD。事實上,看起來我在 OOP 上有一些缺失的地方。假設我們有一個名為 Product 的域模型。基于OOP,資料和行為必須結合在一起。示例可能是錯誤的,但資料和行為在下面。
public class Product
{
public Guid Id { get; set; }
public double TaxRate { get; set; }
public double Price { get; set; }
public double GetFinalPrice()
{
return Price * TaxRate;
}
}
假設我們需要獲取一個類別中的所有產品,在這種情況下我應該在 Product 類中添加一個方法來回傳一個類別中的所有產品嗎?這對我來說看起來不太好,因為 GetProducts 行為不能在 Product 物件中。
在這種情況下,我應該創建一個 CategoryProductFetcher 物件并為行為添加一個方法 Fetch 嗎?這聽起來也是錯誤的,因為我將為所有串列方法創建一個類。
你能幫我解釋一下這個概念或任何檔案嗎?我讀了很多文章,但都是基本的,沒有解釋更多。
提前致謝
uj5u.com熱心網友回復:
您可能需要從 DDD 中查找一些其他概念:
- 總計的
- 應用層
- 存盤庫
- CQRS
聚合只能對聚合內的行為負責。具體來說,“產品”聚合(單數)只能負責該產品實體中發生的事情。它不應該負責為您檢索其他產品。
存盤庫是應用程式層和資料存盤之間的中介。它們提供了檢索聚合的方法,這些聚合已準備好在它們上執行命令。它們還提供了向資料存盤添加新聚合的方法。
應用層將從存盤庫中檢索聚合,然后要求聚合在該單個聚合實體的邊界內執行功能。
CQRS是您的域模型中的類負責在命令用例中實作邏輯的想法。命令用例是改變現有資料狀態的用例。
CQRS 然后建議您的查詢應該采用不同的路徑(而不是通過您的域物件)。例如,您的查詢模塊可以直接查詢資料庫并將該資料投影到 DTO 中以回傳給客戶端。
要求存盤庫檢索特定聚合應該在其上執行寫入操作。這意味著,在檢索和執行聚合操作時,存盤庫應該針對寫入操作進行優化,而不是執行業務邏輯和遵守業務不變數。因此,資料只能通過聚合上的單個事務進行更改,并且這些聚合應通過其各自的存盤庫持久保存。
另一方面,查詢應該針對讀取操作進行優化,并且可以并且應該繞過存盤庫以及聚合和檢索不涉及更改資料的相應用例所需的資料。該資料也可以從不同的聚合中組合。
例如,更改產品應該通過產品聚合提供的操作(方法)發生,然后再次通過聚合持久化。例如,如果您只需要顯示相應類別的產品資訊串列,請通過經過優化的查詢來檢索該用例所需的資料。由于存盤庫總是完全加載以確保在更改相同存盤庫時所有業務規則都可以正確執行,因此不適合檢索大量聚合,應使用讀取優化查詢。
閱讀材料:
- 藍皮書
- 紅皮書
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494857.html
上一篇:使用自定義混合型別創建Enum
