2008-12-17 31 views
2

當您的域或業務層(無論您想要調用它)是否與您的用戶界面完全分離時,它如何收集所需信息完成請求?域層向用戶界面發出呼叫的最佳方式

例如,假設用戶界面發出添加一行到採購訂單的請求,業務規則確定您出於某種原因需要授權碼。領域層如何傳達這一點?返回某種表示需要授權的響應代碼?發起「需要授權」事件並查看是否有人迴應?接受UI將實現的某種IAuthorizationProvider?

所有這些看起來都沒問題,但我很擔心企業可能需要的可能事情爆發。繼續購買訂單示例,如果某些項目需要顏色,該怎麼辦?有些需要有危險材料聲明ID?有些需要一個簡單的「這很少見,你確定嗎?」。該清單可以繼續。這感覺就像決定你需要這個信息絕對屬於領域層。在非分層應用程序中,您只需彈出一個對話框並獲取所需內容。你如何在一個正確的分層應用程序中做到這一點?

回答

0

我已經做了一些更多的閱讀並發現了Martin Fowler的Notification Pattern,這似乎是爲了解決這個問題以及Jeremy Miller的Domain Centric Validation with the Notification Pattern

這是通知的福勒的描述,它描述幾乎正是我一直在尋找:

收集在一起有關領域層錯誤和其他信息,並將其傳送到演示文稿對象。

+0

在某些情況下,通知是通過例外來實現的。在其他情況下,它是一個帶有屬性名稱的錯誤詞典和帶有單個錯誤消息的錯誤列表(或列表)。 – 2008-12-17 21:00:35

1

演示者或控制器,取決於如果你做MVC或MVP應該知道它,而不是域,域將會斷言(防禦性編碼)是所有需要的值都OK,或拋出異常,不要求它。

因此,假設您不提供數字,您的模型會拋出AuthorizationNumberRequiredException,那麼您的演示者將從那裏處理它。因此,您的域名與主持人無關,它只是拋出錯誤,主持人必須知道如何處理它,但它不會重複邏輯。

+1

但這些顯然是業務規則。他們爲什麼會出現在與UI有關的主持人中。假設我在一個沒有主持人的服務中使用這個域 - 我是否會重複服務中的規則? – 2008-12-17 18:16:06

1

某處的UI必須在某個點將信息傳遞到業務層。無論您是否正在瀏覽控制器等中間對象,業務層需要確定PO是否處於有效狀態。如果不是,則返回說明錯誤的信息。這可以從PurchaseOrder.AddLineItem方法調用或者可能的PurchaseOrder.Validate方法中進行。我的首選是從PurchaseOrder.AddLineItem方法返回驗證信息,以便您可以確定對象狀態在那裏是無效的。

2

「...業務規則確定您出於某種原因需要授權代碼。域層如何與之通信?」

這就是API的用途。你有幾個選擇。

  1. 業務規則API只是列出業務規則需要的各種東西。用戶界面負責提出完整的請求。這些東西不是動態的。這不像業務規則隨機變化。有這種事情的版本控制。

  2. 異常工作正常。該請求引發異常,因爲它不完整。 API指定異常以及如何在沒有異常的情況下發出「完整」請求。

  3. AuthorizationProvider的計劃也不錯。該API將被定義爲澄清對AuthorizationProvider執行的請求。

「我爲可能發生的事情發生了很大的變化......這份名單可以繼續下去。」事實上,它沒有。只需定義適合問題域的適當API。

如果 - 出於某種原因 - 您害怕無法定義API,那麼您也無法定義問題。

「但是......怎麼樣」,例如,有些物品有顏色或MSDS。怎麼樣的一個配置對話框?

  1. 顏色 - 或其他詳細信息,如MSDS。首先,該模型具有「需要顏色」設置。用戶界面只需檢查是否需要顏色對話框。這些只有有限的一部分,所有這些都是你正在解決的問題的一部分,並且都可以列舉出來。

  2. 確認稀有物品。同樣,業務規則具有「需要確認」的屬性或方法。用戶界面檢查這一點。這些只有有限的一部分,所有這些都是你正在解決的問題的一部分,並且都可以列舉出來。

您不會彈出一個新的對話框。使用單獨的用戶界面和業務規則,您現在可以做兩件事:

  • 將信息添加到業務規則;
  • 使UI檢查彈出對話框。

您不會添加大量的代碼。業務規則屬性是幾行代碼。 UI檢查是一行代碼。

相關問題