我一直處於類似的情況,有一堆MVC站點共享許多常用功能。
我們所做的首先是在一個單獨的解決方案(我們稱之爲「全局」)中隔離所有這些常見的東西。該解決方案的結構與所有MVC站點幾乎相同,並且包含「全局」特定業務邏輯,接口,實體,存儲庫和UI組件(即:頁眉和頁腳,登錄功能等)。這些常見的功能組織在portables areas中,只要您在其中一個MVC站點中需要其中的一個,就可以使用專用的Nuget包進行部署。
爲了能夠測試我們開發的所有便攜式領域,無需部署它們,我們在Global sln中創建了一個「啓動器」站點。這個網站從未被部署;它僅爲測試目的而構建。
我們的MVC架構不是常見的n層架構,而是Onion架構。如果你有興趣,請看看所有related StackOverflow questions。我們所有的MVC站點都在使用StructureMap DI,以便在啓動時將我們使用的所有接口與正確的實現綁定。全球擁有自己的DI容器配置部分。其中StructureMap結合所有
GlobalConfig.Init();
GlobalConfig.RegisterAllAreas();
Init方法是:你必須做的事情正確運行的唯一的事情,就是調用MVC網站的Global.asax文件中的這2種方法該主機的便攜領域接口與正確的實現和RegisterAllAreas方法註冊便攜式區域路由和捆綁。這兩個方法必須在MVC站點自己的路由,綁定和DI之前註冊。
這裏是全球SLN文件夾結構:
Web.xxxx項目都是你需要創建不同的便攜式領域。即使您的MVC網站只需要用戶帳戶共享功能,最好將事情分開以避免需要始終部署所有內容。
這裏是在Web.xxxx項目結構的一個仔細一看:
便攜式區域項目被稱爲xxxx.Area,它包含的區域的所有視圖和控制器。它也有xxxxAreaRegistration.cs,它定義了該區域的路由和捆綁。
視圖模型和構建器位於名爲xxxx.ViewModel的單獨項目中。
xxxx.Domain和xxxx.DomainModel項目是存儲區域的所有服務實現和域模型的地方。 Xxxx.Data是該區域存儲庫實現的地方。
所有地區的服務和存儲庫接口都存儲在合同項目中(見圖#1),並可以通過特定的Nuget包單獨部署。
這是我們在這裏組織事物的方式的大圖,如果您想要使用這種架構,請不要猶豫,如果您需要更多信息和細節。
希望有幫助!