2011-02-11 59 views
1

我以前認爲我的Domain對象在其方法中不應包含存儲庫調用。但是我面臨以下問題。
我知道域對象必須始終處於集成狀態。 例如,如果您有規則Order不能在沒有訂單行的情況下存在,則需要在構造函數中添加orderLine並使LineOrder集合爲只讀。商業對象方法中的存儲庫對象

在我的情況下,如果訂單進入批准狀態,我需要檢查客戶是否有足夠的資金進行訂購,以及應用程序是否可以爲該客戶進行轉賬,然後將訂單轉移。因此,我的order.Approve方法需要調用相應的存儲庫方法來檢查是否可以批准訂單並獲取所需的導航屬性(Order - Transfer Association)。

如果我沒有在批准方法中進行這種檢查和分配,並在OrderService類中創建Approve方法(因爲批准可能被視爲進程),那麼如果有人調用它,我的批准方法可能會導致對象處於未集成狀態其他代碼部分。

所以我的問題是: 1.如果在域對象方法中使用存儲庫是不對的,那麼如何解決上述對象的完整性問題?
2.如果批准不是過程,那麼客戶中的過程是什麼樣的? :)

回答

3

也許你應該考慮到單個實體可以有多個驗證上下文。

您的問題的答案: 1)您不應該在域模型中使用存儲庫。 2)批准似乎更像是與服務有關的問題,與您的訂單無關。

+0

嗯,你是什麼意思的多重驗證上下文?每個訂單狀態都必須有單獨的驗證碼? – Danil 2011-02-11 14:43:35

0

NHibernate和EntitiFramework通過延遲加載(按需)所需的子項解決了這個問題。

foreach(var transfer in myOrder.Customer.Transfers) 

通過訪問myOrder.Customer客戶對象從數據庫加載。

通過訪問myOrder.Customer.Transfers tranfers集合從數據庫加載。

這樣就不需要訪問存儲庫。

以下示例說明如何消除業務方法中存儲庫的需求:how-to-create-fully-encapsulated-domain-models