2013-03-25 55 views
1

我正試圖圍繞IoC容器包裝頭部。隨着我深入探究這種設計模式,在我簡單地實例化一個數據上下文類之前,我會遇到許多抽象層,接口和具體類,然後使用它,然後處理它。如何在MVC Web應用程序中使用E.F實現IoC容器

雖然我很想繼續前進,但仍有一些突出的問題,我不知道如何解決,希望得到一些澄清和指導。

  1. 在具有2個項目(MVC幅&數據層 含有EF)的通用web應用程序,如果我們的扶養解析器期望的存儲庫 實現特定接口(允許我們在任何時間切換 庫未來),界面 在哪裏定義?我沒有看到它是如何在mvc web項目中定義的,因爲那麼數據訪問層將依賴於它,並且它不能駐留在數據訪問層中,因爲mvc項目取決於dal,而且我錯過了整個點這個練習。那麼 的答案是在兩個項目中定義它,並讓每個項目 引用它自己的副本?這甚至可能嗎?或者我需要 創建第三個服務層項目並在其中粘貼一個界面 聲明,並讓這兩個項目都引用它?

  2. 我看過一些文章談到團結IoC和 接口,如IProductRepository,IClientRepository和 IProductService,IClientService(這就是我指的是在 我的首段)。我是否正確地假設這些 實例中的每一個都應該在我的數據庫中引用一個表?如果是的話 如果我有50張桌子會發生什麼?我是否需要創建50個存儲庫 接口和50個表相關的接口來解耦所有內容? 如何使用EF與POCO類影響事物?我需要 每個POCO都實現它自己的指定接口嗎?

感謝

+0

不要將邏輯層(表示,數據,業務)與物理層(mvc項目/程序集,數據)混淆。一個應用程序可以在一個物理組件中,並且仍然在邏輯上分層結構,不會直接與彼此進行對話,在必要時注入組件。 – Maarten 2016-04-28 10:18:23

回答

0

理想情況下,你將你的解決方案分成幾個項目。

您將擁有一個定義了接口的合同項目,這是實現這些接口的具體版本的dal。

您的mvc項目會引用合同項目來處理對類型的引用。

您將使用IOC容器掃描bin文件夾中的程序集,並找到控制器相關性的具體實現。這意味着你會將你的dal建立到你的mvc項目的bin文件夾中。這意味着你可以簡單地通過在bin文件夾中放置一個新的dll來切換其他實現。

至於倉庫和表格,我傾向於按業務功能對它們進行分組。因此,管理用戶及其相關表格的業務功能將位於用戶存儲庫等中,但這歸功於個人偏好imo。

0

當你把你的項目分成多個層時,你是正確的,不希望你的數據層依賴於棧上的項目。一般而言,你希望這些依賴是單向的。您可以繼續執行您正在做的事情並將接口放入數據層,也可以創建一個新的項目來存放模型代碼,包括存儲庫和服務接口。你的數據層將取決於模型代碼,你的mvc層將取決於數據層。

要解決您的第二個問題,我會說這是設計藝術的地方。您不一定需要在您的實體和數據表之間進行一對一的映射。如果它是有意義的,並且您認爲它是可管理的,特別是在Entity Framework的幫助下,那麼繼續進行一對一映射。但請記住,持久層和領域模型層的職責是不同的。如果持久層開始堵塞創建領域模型的工作,那麼現在是時候將一些工作分離出來。

更重要的是將要暴露於mvc項目的界面「外牆」。這些將需要一定程度的與模型和持久層的解耦。應該將它們歸結爲模型的核心責任。你不想讓你的領域模型錯綜複雜的應用層。

+0

爲什麼MVC層依賴於數據層?如果你是因爲除了在bin輸出文件夾中獲取已編譯的程序集之外的任何其他原因而這麼做的話,那麼你是出於錯誤的原因這麼做的。 – Maarten 2016-04-28 10:20:26

相關問題