2011-04-27 67 views
0

我遇到了一點障礙,雖然我有一個可能的解決方案,我會不介意一些反饋。Visual Studio項目體系結構爲更好的可重用性

我的當前的解決方案是這樣的:

  • Common(包含數據存取,域和其他雜項類的其他解決方案中使用)
  • Client(WPF客戶端)
  • ClientPresentation(WPF客戶端邏輯,其中所有視圖模型駐留)
  • Service(電子郵件服務)

所有3種解決方案(minus Common)參考解決方案Common用於數據訪問。我面臨的問題是我的存儲庫(Common)引用ClientPresentation,因爲它返回了一個視圖模型列表。現在,當我嘗試參考ClientPresentation中的Common時,我收到一條錯誤消息,提示存在循環拒絕。我應該簡單地重構我的數據訪問類(在我的情況下的存儲庫)以返回域對象和映射,然後在稍後的ClientPresentation解決方案中與他們的視圖模型相對應?

我確定解決方案很簡單,但我希望得到一些反饋。

+0

你爲什麼要讓他們互相引用?從ClientPresentation提供它需要的東西的「硬拷貝」是否會更容易?因此它不需要參考? – FreeSnow 2011-04-27 17:52:45

+0

@DalexL - 解決方案將引用彼此,因爲位於'Common'返回視圖模型中的存儲庫和'ClientPresentation'需要'Common'用於數據訪問。 – Mike 2011-04-27 17:55:10

回答

4

存儲庫不應該返回視圖模型。這是一個禁忌。

存儲庫應該返回一個數據對象或業務對象(取決於應用程序的複雜性),然後UI層應該負責在這些對象之上構建視圖模型。

3

一種解決方法是按照您的設置,然後將這些域對象手動映射到您的視圖模型或使用映射器庫(如automapper或valueinjecter)。

第二個解決方案是沒有這麼多的DLL,除非你打算重新使用它們。

這是您應該回答的問題: 您是否有機會分別重新使用數據訪問或視圖模型? 如果不合並一個程序集中的所有內容並使用文件夾爲項目提供結構:例如數據訪問文件夾,視圖模型文件夾和視圖文件夾? 此解決方案也意味着讓您的存儲庫返回域對象,而不是查看模型,但沒有太多dll。

通常人們會從事企業架構而不需要它。

1

我的猜測是您的ClientPresentation方法正在調用您的Common方法,該方法又調用您的ClientPresentation方法。

我有相當於一個Common類(我稱它爲Global,雖然)。其中,我聲明所有方法和變量爲static,傳入並返回需要使用的任何值。雖然使用static類不會消除循環引用,但它可以幫助找出造成它們的原因。

只是一個雖然。不是一個真正的答案。

編輯:我看到你添加了一點在評論之前,我發佈了評論。我不確定這個答案是否有幫助。我開始刪除它,但想法總是可以提供意想不到的用途。

1

您的設計很好,但我會將POCO對象返回到ClientPresentation圖層。 ClientPresentation圖層可以填充ViewModels。很多時候ViewModels包含額外的數據或派生列,所以它們不會直接從存儲庫填充。

1

您應該通過使用接口或使用可映射到視圖模型的模型來將您的VieModels與存儲庫分離。這些模型可以保留在公共層中,以便您的存儲庫可以引用該模型而不是視圖模型。視圖模型最終可能會將該模型作爲參考並使用它。