10

我目前正在計算如何重構現有非模塊化ASP.NET MVC 3.0應用程序的體系結構。我有一個類似於結構的插件來使現有項目可擴展。組合ASP.NET MVC Web應用程序(MEF,區域,DI)的最佳實踐

我已經搜索了不同的策略來製作模塊化的Web應用程序,並發現以下內容。我希望你對這些想法發表評論。

  • MVC地區在不同的項目

爲每個插件我想創建一個包含控制器,視圖和視圖模型插件個別ASP.NET MVC項目。 「員工」模塊將包含一個區域來列出,創建,更新和刪除員工。然而,這聽起來不錯,AreaRegistration需要將所有區域放在「bin」目錄中。我找到了一種方法,直接把我區的項目在區域文件夾,並從「/區/ [AREANAME]/bin」文件夾解決區域組件:

BuildManager.AddReferencedAssembly.Add(Assembly.LoadFrom(…)); 
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblies; 

這是合作得非常好,讓我來部署主項目的Areas文件夾中的插件。我喜歡使用ASP.NET MVC開箱即用的功能。

  • MVC便攜領域(MVCContrib)

http://elegantcode.com/2012/04/06/mvc-portable-areas/

便攜式領域似乎並沒有成爲一個很好的方法,因爲它們需要的觀點是在該地區的項目編譯爲嵌入式資源文件。這會阻止IIS緩存。另一方面,我真的無法想象性能缺陷究竟有多大。

  • 基於MVC模塊使用MEF

http://www.fidelitydesign.net/?p=104

爲了創造我在很大程度上依賴於MEF等項目鬆散耦合的服務。因此我認爲使用它來發現ASP.NET MVC模塊/插件是一個好主意。我最終會使用一個ControllerFactory來實例化使用'Export'屬性導出的控制器。這樣我就可以完全控制插件實例,並可以使用MEF獲取服務。然而,使用MEF確實需要比使用MVC區域更多的工作,這些區域解決了控制器的問題。

  • 實體框架橫跨插件工程

的一個問題,我無法迄今爲止解決的,是如何在各個插件項目分發的實體。目前我們使用數據庫優先方法,它由一個包含所有實體的* .edmx模型文件組成。即使使用DbContext或Code First,也無法爲一個數據庫使用多個DbContext類。一個想法是使用MEF從不同插件中加載實體到一箇中央DbContext類中。但是我不知道這是否是支持和/或推薦的設置。

回答

3

另一種選擇是使用我的Griffin.MvcContrib。它爲您處理所有管道工作,並允許您編寫視圖並使用代碼更改較少的區域。

與IoC容器一起使用以獲得強大的插件系統。

這裏是一個演示瞭如何的文章:http://www.codeproject.com/Articles/386674/ASP-NET-MVC-3-plug-in-architecture-using-Griffin-M

+0

謝謝你指着我的Griffin.MvcContrib項目。看起來很棒!最後一個問題:如何在插件之間共享使用Entity Framework的實體?或者所有實體都必須駐留在一個數據層項目中? – Toni

+0

我不共享EF實體(我通常使用數據庫實體和業務對象之間的映射器抽象出數據源),但我會將常用實體放在單獨的項目中 – jgauffin

+0

但是這不需要重複代碼,因爲EF實體類和我的域類基本相同?此外,我無法查詢域類,因爲它們不實現'IQueryable'。 – Toni