ASP.NET MVC 2.0 3.0 4.0分離項目區域實現多人開發管理方案

 ASP.NET MVC 4.0分離項目區域

 實現多人開發管理方案

     很曾經開發過ASP.NET MVC 的程序員,在開發大型項目的時候會發現使用MVC框架搭建項目可以很好的吧ADOADO Entity、業務層、UI 劃分開在不同的項目中,視圖層使用ASP.NET MVC去呈現在視圖中。在項目中UI的頁面比較多的時候,會發現需要很多個的區域去劃分UI層的表現,在開發過程中需要多個程序員去編寫項目的UI層。在以前的 ASP.NET MVC 1.0中是無法把UI層劃分出來做成DLL來加載到主顯示程序中來顯示。在2.0 之後就出現可以把每個區域都劃分成不同的項目編譯成不同的DLL加載到主程序上,這樣的做法可以讓開發團隊開更好的共同開發,並且不會產生某個程序員改動了一些樣式或者內部頁面導致其他頁面出現錯誤。

現在我就以一個簡單的ASP.NET MVC 4.0 項目作為例子示範如何把ASP.NET MVC的區域分離成不同的項目。下面需要的框架和擴展插件有: ASP.NET MVC 4.0NuGet.Tools.vsixMvc3FuturesMvcContrib;其中Mvc3FuturesMvcContrib VS中的 工具→庫程序包管理器→管理解決方案的NuGet程序包下載直接部署到項目中。

話不說那麼多了,首先我們先安裝好ASP.NET MVC 4.0NuGet.Tools.vsix,我這裡使用的是VS2012 本身包含了ASP.NET MVC 4.0所以不用下載MVC4.0框架只要下載NuGet.Tools.vsix 插件包就可以了。(NuGet.Tools.vsix 在文章的附件可以下載)

開始動工囖,第一步創建MVC4.0的基本項目在項目右鍵添加區域名稱隨便(本文以Admin為區域名),反正等下都要刪除。如圖:

    第二步把區域裏面的Views目錄裏面的Web.config 文件移動到 Areas目錄下,然後把整個Admin目錄移除。

結果如圖:

 

                                   Web.config文件中的內容不用修改

    第三步添加多個ASP.NET MVC4.0空白項目[項目名稱:Mvc.Admin],然後添加需要的庫(DLL) Mvc3FuturesMvcContrib VS中工具→庫程序包管理器→管理解決方案的NuGet程序包 出現下圖:

        點選 聯機 NuGet官方程序包源分別搜索 Mvc3FuturesMvcContrib  [題外話:這裡有很多很好的插件大家有空不防去下載來使用] 下面圖片就是部署這兩個DLL的步驟 

點擊   安裝如下圖

 

 

選擇需要部署的項目,點擊確定就會自動部署到需要該DLL的項目中。
下面繼續安裝部署 MvcContrib 步驟同上如圖:  

 

選擇 MvcContrib 點擊安裝,注意:右面的紅框的位置可以看到該DLL的最低需求。點擊後如圖:

 

和剛剛一樣,選擇需要部署的項目,點擊確定就會自動部署到需要該DLL的項目中。

 好了這些都部署好了,那麼現在就要把他們關聯起來,首先在主項目中引用區域項目如圖:

在VS2012 引用管理器已經改善很多了,速度比以前快好幾倍,加上單選勾非常方便的多選幾個需要引用的項目或者庫(DLL)。

       首先我們要改寫一下路由在原基礎上增加命名空間的名字讓程序更好的管理項目調用,在主項目中App_Start 目錄下的RouteConfig.cs 位子下圖

   

 點擊打開該文件看見內容中只有一個方法public static void RegisterRoutes(RouteCollection routes)在這個方法裏面源代碼

  1. routes.MapRoute(
  2. name: "Default",
  3. url: "{controller}/{action}/{id}",
  4. defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  5. );

        我只需要修改一下這段代碼就可以,怎麼修改呢只要在參數列中增加關聯的命名空間就可以了namespaces: new[] { "Mvc.Controllers" } 整合代碼如下:

  1. routes.MapRoute(  
  2.                 name: "Default",  
  3.                 url: "{controller}/{action}/{id}",  
  4.                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },  
  5.                 namespaces: new[] { "Mvc.Controllers" }  
  6.             ); 

 

主項目的設置已經完成跟著下來就是區域項目的設置,之後新增的區域項目後只需要在主項目中添加引用就可以使用了,我們在主項目建立最簡單的控制器和視圖就是 Home 控制器 Index視圖視圖中隨便寫點東西用來區分不同區域的顯示效果。
         下面就是區域項目中的設置,不管3721先把區域項目[這裡是Mvc.Admin項目] Global.asax App_Start 目錄下的文件(FilterConfig.csRouteConfig.csWebApiConfig.cs) 刪掉因爲不需要這些了,然後在項目[Mvc.Admin]表面添加一個區域組冊的類,這個類有命名規範的必須是AreaRegistration 結尾的前面名字必須是區域名稱,那麼當前我們就以 Admin為區域名稱創建類AdminAreaRegistration讓它繼承MvcContrib.PortableAreas. PortableAreaRegistration
抽象類,主要重寫 public override string AreaName  public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus) 這兩個方法,整個代碼如下:
  1. using System.Linq;
  2. using System.Web;
  3. using System.Web.Mvc;
  4. using MvcContrib.PortableAreas;
  5. namespace Mvc.Admin
  6. {
  7. public class AdminAreaRegistration : PortableAreaRegistration
  8. {
  9. public override string AreaName
  10. {
  11. get
  12. {
  13. return "Admin";
  14. }
  15. }
  16. /// <summary>
  17. /// 標記當前項目的命名空間
  18. /// </summary>
  19. public string AreaControllersNamespace
  20. {
  21. get
  22. {
  23. return "Mvc.Admin.Controllers";
  24. }
  25. }
  26. public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
  27. {
  28. //Resource
  29. if (context.Routes["ResourceRoute"] == null)
  30. {
  31. context.MapRoute(
  32. "ResourceRoute",
  33. base.AreaRoutePrefix + "/resource/{resourceName}",
  34. new { controller = "EmbeddedResource", action = "Index" },
  35. new[] { "MvcContrib.PortableAreas" }
  36. );
  37. }
  38. //Scripts
  39. context.MapRoute(
  40. AreaName + "_Scripts",
  41. base.AreaRoutePrefix + "/Scripts/{resourceName}",
  42. new { controller = "EmbeddedResource", action = "Index", resourcePath = "Scripts" },
  43. new[] { "MvcContrib.PortableAreas" }
  44. );
  45. //Content
  46. context.MapRoute(
  47. AreaName + "_Content",
  48. base.AreaRoutePrefix + "/Content/{resourceName}",
  49. new { controller = "EmbeddedResource", action = "Index", resourcePath = "Content" },
  50. new[] { "MvcContrib.PortableAreas" }
  51. );
  52. //Default
  53. context.MapRoute(
  54. AreaName + "_Default",
  55. AreaName + "/{controller}/{action}/{id}",
  56. new { controller = "Home", action = "Index", id = UrlParameter.Optional },
  57. new[] { AreaControllersNamespace }
  58. );
  59. RegisterAreaEmbeddedResources();
  60. }
  61. }
  62. }

把這段代碼複製到你AdminAreaRegistration.cs文件就可以,這段代碼我優化了一下以後只要更改AreaName AreaControllersNamespace 屬性就可以使用在其他區域項目上

         爲了演示在這個區域項目中增加 控制器 Home 視圖 Index,在視圖中爲了區分顯示是否在這個區域顯示頁面,我在視圖內容中編寫 這裡是Admin 區域首頁幾個中文字。項目結構如下圖:

 

 

    這樣還沒有行我們還差一步,究竟差什麼呢?原來我們的視圖Index.cshtml MVC項目是實體文件並非在DLL裏面,我們要設置一下纔可以把 Index.cshtml 編譯在DLL裏面,鼠標右鍵點擊 Index.cshtml 文件 屬性,然後把生成操作更改爲嵌入的資源這樣就可以把這個文件編譯在DLL中,如果在開發中有相關的JSCSS、圖片等文件都需要把生成操作更改爲嵌入的資源才會有效。 



好了運行看一下效果
 

      

運行很成功把項目分離出來了。

下面問題來瞭如果這個項目擴展多一個區域怎麼去增加呢下面我就示範多個區域項目。

         第一步:在解決方案中添加一個新項目[Mvc. Account] 和剛剛上面的區域項目一樣先把不需要的文件刪掉;

         第二步:右鍵點擊該項目選擇 管理NuGet程序包 如圖:




                         然後聯機 安裝 Mvc3FuturesMvcContrib 兩個 DLL

         第三步:在主項目中添加引用該區域項目;

         第四步:添加區域註冊類AccountAreaRegistration.cs 記住要使用命名規範哦!把之前的內容複製過來,修改 AreaName [區域名] AreaControllersNamespace [控制器所在的命名空間] 屬性便可;

         第五步:添加控制器和視圖來測試一下 這裡視圖內容是 這裡是 Account 區域首頁”;

         第六部:運行測試結果如下圖。



 

本文章需要的 NuGet.Tools.vsix 和 源碼 點擊下面連接下載

MVC 分離區域項目功能

NuGet.Tools.vsix

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章