1

我讀了StackOverflow guidelines,尋找一個design-specific SE site。如果您覺得這個問題仍然太長或不清楚,請告訴我,我會再試一次。我的DAO層如何與表示層交互?

我維持業務的N層線,WinForms應用程序用下面的層/圖案:

  • [WinForm的應用]
  • [基於MVP-表示層(CAB, 特異性)]
  • [服務層]
  • [數據訪問層]

中的應用與集成其在DAO層通過使用DAO接口ERP /業務系統的特定實現方式中的處理,例如,不同的ERP /業務系統:

public sealed class QBTransactionAssemblyBuildDAO : QBDAO, ITransactionAssemblyBuildDAO 
public sealed class SAPTransactionAssemblyBuildDAO : SAPDABase, ITransactionAssemblyBuildDAO 

例如,一個業務部門可以使用與QuickBooks集成的應用軟件。這將在app.config中配置,並且工廠方法將在運行時創建適當的QB * DAO實現。同樣,另一個部門可能會將其與SAP集成,配置文件將支持此功能,工廠將生成SAP * DAO實施。然後服務可以使用DAO,同時保持對底層集成系統的無知。

這一切都很好工作,事實上是我不得不添加額外的集成系統和記錄支持設計已經支付的股息。當我遇到集成應用程序的API不支持所有其他系統可以支持的任務時,今天的情況都發生了變化。我現在在一個情況下,我需要支持一個特殊的流動,而不是說更新數據,SAP,我需要顯示一個對話框,與他們的數據用戶手動抄寫(OK,複製和粘貼)到SAP應用程序用戶界面。

如果我堅持我的層和對象分離準則第一次有機會對我來說,我的分支應用流程是業務層,因爲這一層是知識淵博哪些ERP /企業應用集成。在服務層,我可以收到對「RecognizeDelayedRevenue」的請求,獲取我對具體DAO對象的引用,並詢問它是否支持該操作(後一部分是新的)。如果它返回負數,我現在面臨的設計挑戰是向用戶展示一個對話框,包括使用屬於DAO對象的方法預處理它呈現的數據。

我的問題:從設計角度來看,這是更大的罪:

  1. 服務層試圖創建並顯示的win32對話框,基本上打破了單獨的業務邏輯的和呈現
  2. DAO對象接受(即聲稱詢問服務)的請求,而不是執行鍼對它的集成系統,它在某種程度上會顯示一個對話框向用戶
  3. 把集成系統研究深入到演講水平和處理異常那裏。

當然,如果你有一個想法,我沒有提到,這也將是非常有趣的! :)

回答

1

我會用3號去,但我會使用一個role interface保持一個抽象層。然後我就會有該接口的存在我的表示層的查詢時,它必須決定是否要使用附加功能:

if (myImpl is IAdditionalFeatureAware) 
{ 
    // ... 
} 
+0

我福勒的粉絲,但之前的角色界面並沒有引起我的注意;感謝您的鏈接。我正在努力如何將您的建議應用於我的3個參與層:將(或不會)實現角色接口的對象將是我的DAO對象,它對錶示層是未知的。你如何參與這個解決方案中的服務層?我的服務意圖處理作爲此問題主題的任務,但直到IT嘗試使用可檢查角色接口的DAO層爲止。我希望這是有道理的。 –

+0

啊。是。我錯過了那個細節。這使得它更加複雜,因爲服務可能支持查詢接口的能力,同時它被用作堆棧的本地部分,但是如果它變成或者是遠程接口,那麼您需要查看詢問服務是否它支持這種功能,作爲響應的一部分獲得答案。你可能能夠做到這一點,並堅持回答而不是不斷詢問? –