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”返回值一致,不然找不到挂件的
显示效果图以下:
相关文章
相关标签/搜索