nopcommerce的掛件技術

  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」返回值一致,不然找不到掛件的
顯示效果圖以下:
相關文章
相關標籤/搜索