概述
nopCommerce的插件機制的核心是使用BuildManager.AddReferencedAssembly將使用Assembly.Load加載的插件程序集添加到應用程序域的引用中。具體實現可以參考nopCommerce解決方案中Nop.Core項目的Plugins目錄下的相關文件。其中PluginManager.cs文件是核心文件,包含了處理插件化的核心代碼。nopCommerce的注釋中感謝了其參考的Umbraco項目,並給出了主要參考文章的鏈接。
我們直接從nopCommerce3.5的實現中抽取必要的實現代碼,制作一個簡易版的插件系統Demo用於演示ASP.NET MVC的插件化,核心只包含一個標記接口IPlugin,一個管理類PluginManager包含2個必要方法Initialize和ReStart。
架構
新建.NET解決方案SimplePlugin,添加2個類庫項目:SimplePlugin.PluginCore、SimplePlugin.SimpleMvcPlugin和一個ASP.NET應用程序項目SimplePlugin.Web。SimplePlugin.Web項目選擇Empty模板並選中MVC引用。設置項目之間的依賴關系和程序集引用:向SimplePlugin.SimpleMvcPlugin添加SimplePlugin.PluginCore項目引用,向SimplePlugin.Web項目添加SimplePlugin.PluginCore項目引用。向SimplePlugin.PluginCore項目添加System.Web引用。


1.約定
(1)約定"~/Plugins"作為插件根目錄。
(2)約定"~/Plugins/bin"作為中等信任級別下的運行時目錄。
插件在運行時加載的是插件程序集在運行時目錄的副本,不直接加載插件而是加載運行時目錄中的副本的原因是避免插件升級或刪除時dll文件被鎖定。2.基礎代碼
向SimplePlugin.PluginCore項目添加如下文件:
(1)IPlugin.cs:作為所有插件的抽象接口。


(2)PluginManager:負責加載插件和引用插件。


(3)向Simple.Web項目添加Plugins目錄和Plugins/bin目錄。向Simple.Web項目添加Controllers/PluginController.cs


修改web.config,配置probing元素。指定trust level為中等信任級別下的插件運行時目錄。


3.編寫插件
通過Nuget向SimplePlugin.SimpleMvcPlugin項目添加MVC程序集引用,需要注意插件的MVC版本與SimplePlugin.PluginCore引用的MVC版本的一致性。
(1)添加Controllers/SimpleMvcPlugin.cs實現接口IPlugin


(2)添加Controllers/SimplePluginMvcController.cs


(2)添加視圖Views/SimpleMvcPlugin/Index.cshtml


(3)復制SimplePlugin.Web項目中SimplePlugin.Web/Views/web.config文件到當前項目的根目錄和Views目錄下。
(4)設置.cshtml以及.config文件類型為內容,生成設置為較新則復制。


(5)設置SimplePlugin.SimpleMvcPlugin項目引用的程序集屬性復制到本地為False。
(6)設置SimplePlugin.SimpleMvcPlugin項目的生成路徑為bin\Debug\SimpleMvcPlugin\和bin\Release\SimpleMvcPlugin\
4.手動部署插件
生成解決方案,訪問SimplePlugin.Web的插件列表頁:


拷貝生成的SimpleMvcPlugin文件夾到SimplePlugin.Web項目的Plugins文件夾下,訪問SimplePlugin.Web的~/Plugin/Install訪問SimplePlugin.Web的插件列表頁


訪問SimplePlugin.Web的~/SimpleMvcPlugin/Index頁


5.自動部署
設置設置SimplePlugin.SimpleMvcPlugin項目的生成路徑為:..\SimplePlugin.Web\Plugins\SimpleMvcPlugin\ 同時設置Debug和Release兩種配置。


重新生成解決方案,訪問SimplePlugin.Web的插件列表頁以及~/SimpleMvcPlugin/Index頁:




6.測試中級信任級別
設置web.config的trust元素的level屬性為Medium,禁止訪問應用程序目錄以外的文件。


重新生成解決方案,訪問SimplePlugin.Web的插件列表頁以及~/SimpleMvcPlugin/Index頁。檢查Plugins/bin目錄:


7.測試視圖文件修改
修改SimplePlugin.Web項目Plugins\SimpleMvcPlugin\Views\SimpleMvcPlugin目錄下的Index.cshtml。查看修改結果:

