Asp.net mvc 各個元件的分離

落葉瀟瀟雨發表於2013-11-12

 

1. 系統常見的分層

在開發asp.net mvc應用的時候,visual studio 給我們建立了預設的文件結構,一般情況下我們在一個專案下工作,參考微軟的官方例子:ContosoUniversity.sln

clip_image001

一般情況下我們可以將DAL單獨出來作為一個專案,最多還加一個介面Layer的專案,構成了簡單的三層架構模式。或者跟進一步講一部分業務獨立出來成為一個Business 層。分離出來的好處,相信大家都有體會:

1. 獨立出來的Layer或說元件,便於替換。特別是通過介面層的引入後,能夠做到程式不依賴於具體的實現類。特別是通過一些Ioc容器的注入,基本可以做到客戶端(呼叫介面的一端)程式的零修改。這也是設計模式裡講的對擴充套件開發,對修改關閉原則,里氏替換原則-依賴於抽象而不是具體的原則。

2. 大的專案中,方便於多個團隊的開發。比如不同的團隊可以開發不同資料訪問層,業務邏輯層。特別是在分散式系統開發過程中,服務端提供給客戶端只是方法的介面。

3. 可維護性,當某個模組出現bug的時候,你只需改改對應的位置,然後compile,然後copy到伺服器上去,不需要整體編譯。

4. 版本化,不同版本的服務層可以給客戶提供不同的服務。通過客戶的不同身份,定位到不同的Controller。

等等,各種好處就不一一細說了。

2. 系統的進一步分層,將Controllers,Filters,Models分拆

接下來,我們來個更徹底的分離這個唯一的專案到多個專案。我們新建一個MvcApplication2專案來做試驗

clip_image002

我們將裡面的Controllers,Filters,Models作為三個專案獨立出來

clip_image003

我們為什麼要將Models獨立出來?有時候出前臺提交資料到Action直接包裝成了Model,如果涉及到資料的更改,業務的操作,我們直接將此model作為DTO(Data Transfer Object)會比較方便。為什麼將Filters,controller獨立出來?大家可以參考上面的論述去琢磨下。不需要修改任何程式碼,只需要各個專案裡面新增對應的引用即可,然後F5執行,沒有任何問題。

3. 系統更進一步的分拆,將Area獨立到各個模組。類似於外掛式的系統開發

我們模擬兩個模組Admin和api,右鍵新增Area…,輸入Admin,右鍵新增Area…,輸入API,新增解決方案資料夾Admin,api,然後在這兩個資料夾下新建兩個Application,MvcApplication1.Admin和MvcApplication1.API,然後將Areas->Admin, Areas->API下面的檔案全部剪下到剛剛建立的兩個專案下面。如下圖

clip_image004

接下來,我們需要修改路由的註冊部分。將主程式裡面Controller的尋找的名稱空間給明確下。

clip_image006

同理修改Admin和api模組的AreaRegistration。

clip_image008

clip_image010

再接下來,我們要新增這兩個子模組的Build Events Post-build event:

mkdir "$(SolutionDir)$(SolutionName)\Areas\Admin\Views"

xcopy "$(ProjectDir)Views" "$(SolutionDir)$(SolutionName)\Areas\Admin\Views" /S /E /C /Y

將對應的View Copy 到主目錄。這是ASP.NET MVC Area尋找View的機制,除非我們自定義ViewEngine。

然後build all,F5執行。

 

如果你認為上面的做法比較麻煩,那麼可以採用第二種方式,引用第三方庫MvcContrib。

在Package Manager Console裡面輸入:Install-Package MvcContrib,但是本人在mvc4下沒有試驗出來。下篇介紹asp.net mvc外掛式架構

相關文章