nopcommerce有着完善的插件處理機制。開發人員能夠預先開發好獨立運行的模塊,在經過自身的插件機制便可加載實現該插件功能。這種插件模式有利於模塊化編程,提升擴展性以及下降模塊之間的耦合度。下面,咱們將添加一個自定義的插件Demo並介紹如何管理插件。html
1.新建類庫項目:右鍵「添加」--「新建項目」--「類庫」。默認的規則是」Nop.Plugin.{Group}.{Name}」。{Group}表示插件的分類(如支付、掛件(Widget)),{Name}是你的插件名 (」HelloWorld」),該Demo中的名字就是「Nop.Plugin.Widgets.HelloWorld」。web
2.指定文件輸出路徑:右鍵文件屬性。將文件的輸出路徑改成\Presentation\Nop.Web\Plugins\Widgets.HelloWorld。注意區分Plugins文件下的插件。編程
3.添加dll引用如圖。右鍵dll文件屬性,「複製到本地」改成"false"。這樣能夠避免生成許多沒必要要的dll文件到輸出路徑。ide
4:添加描述文件。文件的格式能夠參考其餘插件。個人Description文件以下:模塊化
Group: Widgets FriendlyName: HelloWorld SystemName: Widgets.HelloWorld Version: 1.00 SupportedVersions: 1.00 Author: Jayson DisplayOrder: 1 FileName: Plugin.Widgets.HelloWorld.dll Description: A test program
右鍵該文件「屬性」--「複製到本地」--「若是較新時複製」。保證該文件爲最新。web.config文件可直接複製其餘插件的。網站
5:實現插件接口「IWidgetPlugin」、「BasePlugin」。「IWidgetPlugin」繼承自「IPlugin」,「IPlugin」是插件操做的最終接口,由於這個demo是劃分在「掛件」(小部件。 Widget是呈如今您的網站的某些部分,主頁的banner圖就是掛件技術實現的)裏的因此繼承「IWidgetPlugin」,具體代碼以下:spa
public class HelloWorldPlugin : BasePlugin, IWidgetPlugin { public HelloWorldPlugin() { } public void GetConfigurationRoute(out string actionName, out string controllerName, out System.Web.Routing.RouteValueDictionary routeValues) { actionName = "Configure"; controllerName = "WidgetsHelloWorld"; routeValues = new RouteValueDictionary() { { "Namespaces", "Nop.Plugin.Widgets.HelloWorld.Controllers" }, { "area", null } }; } public void GetDisplayWidgetRoute(string widgetZone, out string actionName, out string controllerName, out System.Web.Routing.RouteValueDictionary routeValues) { actionName = "PublicInfo"; controllerName = "WidgetsHelloWorld"; routeValues = new RouteValueDictionary() { {"Namespaces", "Nop.Plugin.Widgets.HelloWorld.Controllers"}, {"area", null}, {"widgetZone", widgetZone} }; } public IList<string> GetWidgetZones() { return new List<string>() { "home_page_helloworld" }; } /// <summary> /// 安裝插件 /// </summary> public override void Install() { base.Install(); } /// <summary> /// Uninstall plugin /// </summary> public override void Uninstall() { base.Uninstall(); } }
6:添加控制器、模型以及視圖,文件結構以下:。Controller負責響應一個ASP.NET MVC網站提出的請求,代碼以下:
public WidgetsHelloWorldController() { } [ChildActionOnly] public ActionResult Configure() { return View("~/Plugins/Widgets.HelloWorld/Views/WidgetsHelloWorld/Configure.cshtml"); } [HttpPost] [ChildActionOnly] public ActionResult Configure(ConfigurationModel model) { return Configure(); } [ChildActionOnly] public ActionResult PublicInfo(string widgetZone, object additionalData = null) { return View("~/Plugins/Widgets.HelloWorld/Views/WidgetsHelloWorld/PublicInfo.cshtml", null); }
當請求控制器時,會跳轉到對應指定的視圖。該程序中,視圖文件只是作簡單的演示,並不複雜,「PublicInfo」視圖文件以下:
@model Nop.Plugin.Widgets.HelloWorld.Models.PublicInfoModel @{ Layout = ""; } @using System <div class="con" style="font-weight:bold; color:red;"> <ul> <li>HelloWorld Nopcommerce</li> <li>HelloWorld Nopcommerce</li> <li>HelloWorld Nopcommerce</li> <li>HelloWorld Nopcommerce</li> <li>HelloWorld Nopcommerce</li> <li>HelloWorld Nopcommerce</li> </ul> </div>
注意:須要保持視圖文件實時更新。右鍵「Views」文件夾中的視圖文件,選擇「較新時複製」
這樣,一個簡單的掛件類型的插件就開發完成了。在前臺調用,添加「 @Html.Widget("home_page_helloworld")」,注意「home_page_helloworld」須要和上文「HelloWorldPlugin 」中「GetWidgetZones」返回值一致,不然找不到掛件的
顯示效果圖以下: