簡體   English   中英

DTO的域模型屬性

[英]Domain model property to DTO

如果我的域模型中有類似的內容,請使用DDD:

public class OrderLineItem {
    public decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
    public decimal LineTotal { get { return UnitPrice * Quantity; } }
}

dto可以具有LineTotal的屬性,作為public decimal LineTotal { get; set; } public decimal LineTotal { get; set; } public decimal LineTotal { get; set; }很好。

假設我現在將UI創建為SPA。 如果要在向訂單中添加數量的行項目時顯示行總數,是否需要在dto / ViewModel /客戶端重新創建計算,還是可以將域模型中的計算移至服務(?)並從我的SPA中調用它? 這似乎更合乎邏輯,但我不確定如何/在何處進行編碼。 如果有人能給我指出一個真正有幫助的例子。

當您嘗試執行某些業務邏輯時,將使用域模型。 例如,添加新的OrderLineItem時,您可能會檢查是否滿足某些業務要求,例如,所有OrderLineItem的總數不能大於N,或者OrderLineItem數量必須小於N。

另外,您可以存儲計算的LineTotal。 無需一次又一次地計算它。 您不希望客戶在將商品放入購物籃后顯示不同的LineTotal。

當獲取相同的OrderLineItem以在UI上顯示時,無需檢查所有這些業務規則,因為已經檢查了它們。 因此,您可以使用單獨的模型,該模型將直接映射到表(或服務模型等)。

我建議閱讀有關CQRS(命令查詢職責隔離)及其與DDD的配合的更多信息。

重讀您的問題后,我發現我沒有完全回答您的問題。 正如我所看到的,您至少有兩條路徑都包括在某個時候使用域模型。

您可以通過在后端調用一些代碼來處理Total,從而在前端完全添加OrderLineItem。 我們可以將這段代碼稱為“域服務”。 在添加所有OrderLineItems並要保留它們之后,您將使用檢查業務規則的域模型來添加它們。 由於UI要求,您可能不得不復制一些業務邏輯。 那是不可避免的。

第二種方法是第一種方法的變體,其中在添加OrderLineItem之后立即使用域模型。 以這種方式,使用我在前幾段中描述的方法來計算並返回Total。 還立即檢查所有業務規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM