在研究Nopcommece項目代碼的時候,發現Nop.Admin是作為獨立項目開發的,但是部署的時候卻是合在一起的,感覺挺好 這裡把他這個部分單獨抽離出來, 主要關鍵點: 至少我用MVC4沒成功,而且折騰了蠻久, 就是把作為插件的網站項目的Dll輸出目錄指定到主項目的Bin目錄,這裡採取的策略是設置 ...
在研究Nopcommece項目代碼的時候,發現Nop.Admin是作為獨立項目開發的,但是部署的時候卻是合在一起的,感覺挺好
這裡把他這個部分單獨抽離出來,
主要關鍵點:
- 確保你的項目是MVC5 而不是MVC4或者以前的版本
至少我用MVC4沒成功,而且折騰了蠻久,
- 自定義ViewEngine
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace AutofacMvc5Test { public class MyPathProviderViewEngine:VirtualPathProviderViewEngine { public MyPathProviderViewEngine() { MasterLocationFormats = new[] { //Admin "~/WebAdmin/Views/{1}/{0}.cshtml", "~/WebAdmin/Views/Shared/{0}.cshtml", }; ViewLocationFormats = MasterLocationFormats; PartialViewLocationFormats = MasterLocationFormats; } protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) { IEnumerable<string> fileExtensions = base.FileExtensions; return new RazorView(controllerContext, partialPath, null, false, fileExtensions); //return new RazorView(controllerContext, partialPath, layoutPath, runViewStartPages, fileExtensions, base.ViewPageActivator); } protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) { IEnumerable<string> fileExtensions = base.FileExtensions; return new RazorView(controllerContext, viewPath, masterPath, true, fileExtensions); } } }
- 設置編譯輸出目錄
就是把作為插件的網站項目的Dll輸出目錄指定到主項目的Bin目錄,這裡採取的策略是設置相對目錄,這裡把WebAdmin當做插件項目,所以設置了他的輸出目錄到主項目的Bin目錄
- 註冊路由
這裡新建了一個AdminAreaRegistration來專門負責WebAdmin相關路由的註冊,好處是每個插件負責自己的事情,相互不影響,
但是這個RegisterArea什麼時候執行呢,就是主網站項目調用 AreaRegistration.RegisterAllAreas();的時候,
那麼AreaRegistration.RegisterAllAreas()主要幹了什麼?
ASP.NET MVC會遍歷通過調用BuildManager的靜態方法GetReferencedAssemblies得到的程式集列表,並從中找到所有AreaRegistration類型,
然後調用每個AreaRegistration類型的RegisterArea方法
註意 之所以說這是一個比較簡單的方式,是因為 這個例子只是把插件項目的DLL簡單的輸出到主項目的Bin目錄,
插件得DLL就已經可以被成功的添加到GetReferencedAssemblies列表裡,
如果就想每個插件都有自己的目錄那麼可能需要你手動的通過BuildManager在APPStart前把每個插件DLL加入到GetReferencedAssemblies列表裡,
代碼下載: https://github.com/xlb378917466/SimplePlugin_asp.netmvc5.git