`

NopCommerc MVC 插件机制分析

阅读更多
原帖地址:http://www.cnblogs.com/haoxinyue/archive/2013/06/06/3105541.html

基本原理


插件话的应用程序一般都是先定义插件接口,然后把插件编译的dll放到固定的目录中,应用程序主程序通过加载那些实现了插件接口的dll来实现插件的使用。NopCommerce也是这样,但作为MVC Web应用程序会有一些不一样,首先是不同信任级别(Full Trust,Medium Trust)的时候加载dll的策略会有不一样,另外就是怎样显示插件中的View的问题。


 


放插件的文件夹


NopCommerce的插件放在网站主目录的Plugins目录下,Plugins下面有很多文件夹,一个插件类库就是一个文件夹。在插件类库中修改编译输出的地址为网站主目录的Plugins文件夹,这样插件生成的dll就能自动在目标文件夹下面。如下图:


3OOVA%B)${1)9$RXCQJVA8C


另一个文件夹是ShadowCopy文件夹,就在Plugins/bin文件夹下。关于为什么要用ShadowCopy,住这篇文章中有所叙述,NopCommerce就是参考它的实现。里面也详细叙述了信任级别的问题。


 


网站启动


我们先来看PluginManager.Initialize方法。通过在PluginManager类上定义如下属性保证PluginManager的Initialize方法在网站开始的时候运行,早于Application_Start运行。


[assembly: PreApplicationStartMethod(typeof(PluginManager), "Initialize")]


在Application_Start之前运行初始化代码主要是为了让网站应用程序可以引用到加载的dll。


 


核心类


IPluginFinder.cs接口:获取插件的信息接口,在ioc里的Nop.Web.Framework.DependencyRegistrar注册此接口。系统启动的时候会加载到内存里。


IPlugin.cs:插件的操作接口,主要有设置插件的属性信息,安装插件接口,卸载插件接口。


BasePlugins.cs 实现IPlugin.cs的方法。


PluginDescriptor.cs  插件的实体类,包含了插件的版本、描述,类型,文件名称,作者,等等一系列状态。


PluginFileParser.cs 包含对插件的实体操作方法,主要是写入插件的描述信息。


PluginFinder.cs 加载所有的插件,并获取它们的信息.


PluginManager.cs 插件管理的主类,看里面的注释,它的插件机制应该是参考的Umbraco这个cms的。


 


加载插件


首先加载插件的描述。每一个插件都必须定义一个插件描述文件,用文本文件Description.txt来定义,名字也是约定的,不能是其他名字。在插件的类库中添加Description.txt,对插件进行描述。Description中的文本字段的格式是固定的,PluginManager会把Description.txt文件转化成PluginDescriptor类,然后存储在内存中。Description中的DisplayOrder字段表示了这个插件的顺序,以便在界面上显示。获取所有的插件描述文件后,它就会去InstalledPlugins.txt里面看,在InstalledPlugins.txt里面有的就是已经安装的查件,没有的话就是没有安装的。PluginDescriptor.Installed属性描述了这个信息。


把需要加载的dll复制到Plugins/bin文件夹下,当然都是要继承自IPlugIn接口的,通过Assembly.Load在家这个dll,再用BuildManager.AddReferencedAssembly把这个dll加载到网站这个应用程序中。要注意的是BuildManager.AddReferencedAssembly必须早网站程序的Application_PreStartInit过程中加入,也就是在Application_Start前。这是要引用的插件都被放在了Plugins/bin下,并被CLR引用了。被引用的插件的Assembly引用将被保存在PluginManager的静态列表中ReferencedPlugins。PluginManager的Initialize方法到此结束。


 


在界面上显示插件


举例来说,我们在定义插件的时候会定义一种类型的插件,比如送货方式。那么我们在定义插件的时候会继承2个接口,一个是IPlugin接口,一个是IShippingMethod接口。在需要显示送货方式插件的时候通过PluginFinder.GetPlugins<T>().ToList() 方法去获取。PluginFinder会去上一步的PluginManager.ReferencedPlugins列表里面去寻找。返回的是IShippingMethod的实例。NopCommerce有个txt文件:InstalledPlugs.txt。只有在这个里面的插件最终会加载到界面上去。可以通过NopCommerce的查件管理页面把最终需要作用于网站的插件加入到这个文件中。


 


 


 


配置插件


NopCommerce的admin网站可以对插件进行配置。如下图:可以配置Display Order 和 IsActive等。主要的逻辑是更新该插件的Description.txt文件和内存中的IPlugin.Descriptor里面的属性。K7~ABQB3W06HYXQ[_VKX{ET


 


定义插件中的Controller,Action和View


稍微复杂的插件基本都包含自己要处理的界面和逻辑。所以在插件的类库中可以定义插件的界面View和相关Controller和Action。在建立Controller和View的时候,不一定要按照规范的Controllers文件夹和Views文件夹来定义,可以定义自己的风格。


在Action中返回View的时候,要输入View的名称,这个名称要包含名称空间,例如:



return View("Nop.Plugin.Payments.CashOnDelivery.Views.PaymentCashOnDelivery.Configure", model);


因为,在编译过后的插件dll中,作为嵌入资源的View会被编译成名叫Nop.Plugin.Payments.CashOnDelivery.Views.PaymentCashOnDelivery.Configure.cshtml的资源文件。


NopCommerce通过一些插件的Configure界面,把一些插件的配置信息保存到数据库中。然后在前台页面显示的时候再从数据库获取。


 


读取嵌入的资源View


插件作为一个类库被加载到应用程序域中。而在定义插件的View的时候,需要把cshtml文件的属性修改成Embedded Resource。它是作为嵌入式资源放到AppDomain中去的。我们可以通过VirtualPathProvider,使 Web 应用程序可以从虚拟文件系统中检索资源,您可以在这篇文章中找到相关知识,NopCommerce的实现和这篇文章是一样的。在NopCommerce中的Nop.Web.Framework类库中有个EmbeddedViews文件夹,里面包含了如果处理嵌入的View的一些类。最后需要在Global.asax进行注册。NopCommerce的代码如下:



//register virtual path provider for embedded views
var embeddedViewResolver = EngineContext.Current.Resolve<IEmbeddedViewResolver>();
var embeddedProvider = new EmbeddedViewVirtualPathProvider(embeddedViewResolver.GetEmbeddedViews());
HostingEnvironment.RegisterVirtualPathProvider(embeddedProvider);


 


 


 


编写NopCommerce插件


可以参考官方文档。其中有一条建议非常好,就是Copy原来的插件,在上面修改。


 


 


把NopCommerce相关插件的部分代码摘取了出来,可以从这里下载。

本文链接

分享到:
评论

相关推荐

    ASP.NET MVC插件 MVC 1.0

    "ASP.NET MVC 插件"标签则进一步强调了这个压缩包的核心内容是与ASP.NET MVC相关的扩展工具或组件,这可能包括视图引擎增强、路由管理工具、身份认证机制、缓存策略等。这些插件通常通过NuGet包管理器进行安装,也...

    ASP.NET MVC插件 MVC 2.0

    ASP.NET MVC插件 MVC 2.0ASP.NET MVC插件 MVC 2.0ASP.NET MVC插件 MVC 2.0ASP.NET MVC插件 MVC 2.0ASP.NET MVC插件 MVC 2.0ASP.NET MVC插件 MVC 2.0ASP.NET MVC插件 MVC 2.0

    asp.net mvc插件

    标题中的"asp.net mvc插件"可能是指一种增强ASP.NET MVC功能的工具或扩展,它可以提供额外的功能,如自动化任务、调试支持、性能优化等。然而,由于没有提供具体的插件名称和详细信息,我们只能假设这可能是一个能够...

    ASP.NET MVC 4 插件化架构简单实现

    ASP.NET MVC 4 插件化架构简单实现 ASP.NET MVC 4 插件化架构简单实现-思路篇 http://blog.csdn.net/hao_ds/article/details/42102969 ASP.NET MVC 4 插件化架构简单实现-实例篇 ...

    MVC3版本插件安装包

    **MVC3版本插件安装包详解** **一、什么是MVC3** MVC(Model-View-Controller)是一种设计模式,广泛应用于Web应用程序开发,尤其是.NET Framework中的ASP.NET平台。MVC3是Microsoft在ASP.NET MVC框架上的第三个...

    基于MVC的消息机制

    基于unity3D轻量级MVC的消息机制,可用于轻量级的开发。 也适合初中级程序猿来学习理解MVC框架。

    asp.net mvc 加载外部插件 插件化实现

    本文将深入探讨如何在ASP.NET MVC中实现插件化,特别是动态加载外部插件的机制。 首先,理解插件化的核心思想是关键。插件通常是一个独立的代码单元,它能提供特定的功能,并可以通过API与主应用进行交互。在ASP...

    MVC路由机制

    ### MVC路由机制详解 #### 一、概述 MVC(Model-View-Controller)是一种流行的软件架构模式,常被应用于Web应用开发中。MVC模式将应用分为三个核心部分:模型(Model)、视图(View)与控制器(Controller)。...

    MVC事件机制的底层架构

    在本文中,我们将深入探讨MVC事件机制的底层架构,并结合“BearRun”项目中的实践,来理解如何修复bug并优化系统性能。** **一、MVC事件机制概述** 在MVC模式中,事件机制是连接模型、视图和控制器的重要桥梁。它...

    vs2010中mvc安装插件

    为了在VS2010中开始使用MVC,你需要安装相应的插件来扩展IDE的功能。这个压缩包文件包含了帮助你开始MVC项目的必要组件和资源。 首先,让我们详细了解一下MVC框架。MVC是一种设计模式,它将应用程序分为三个主要...

    Asp.net Mvc简易插件系统示例

    在这个"简易插件系统示例"中,我们将探讨如何在Asp.NET MVC环境中创建一个可扩展、模块化的插件架构。 首先,让我们理解什么是插件系统。插件系统是一种允许应用程序通过安装额外的代码模块(即插件)来增加功能的...

    ASP.NET MVC 3.0 插件

    标题中的“插件”可能指的是该压缩包包含ASP.NET MVC 3.0的安装程序和可能的扩展或工具。"AspNetMVC3Setup.exe"很可能是ASP.NET MVC 3.0的主要安装程序,而"AspNetMVC3Setup_CHS.exe"可能是中文版的安装程序,方便...

    MVC插件通过MEF并注入Autofac.zip

    本文将详细探讨如何使用MEF与Autofac在MVC项目中协同工作来构建插件化的应用。 首先,让我们了解MEF。MEF提供了一种机制,使得应用程序能够动态地发现、加载和组合外部组件,这些组件可以是单独的类库或整个应用...

    mvc验证码源码及插件

    总结来说,"mvc验证码源码及插件"是一个为MVC应用提供验证码功能的工具,它包括一个可以直接引用的插件和源码,方便开发者快速实现验证码功能,增强网站的安全性。通过对源码的学习,开发者可以深入了解验证码的生成...

    ExtJs 4 MVC 新机制测试源码奉献

    ExtJs 4 用了一段时间了,今天研究了下ExtJs4的MVC机制,感觉还挺好,建议大家尝试,所以就写了一个demo,帮助那些对ExtJs还不是很懂,或者想用ExtJs4却又不知道怎么做好的朋友。。。多余话不说了大家如果有什么不...

    asp.net mvc 皮肤机制实现例子

    在这个"asp.net mvc 皮肤机制实现例子"中,我们将探讨如何在ASP.NET MVC应用中实现皮肤(或主题)机制,使得用户界面可以根据用户需求或特定场景进行定制。 皮肤或主题通常指的是应用的外观和感觉,包括颜色、字体...

    mvc 3.0 (打包插件) 适用于2010 以上

    标题中的“mvc 3.0 (打包插件) 适用于2010 以上”指的是这是一个针对Microsoft ASP.NET MVC 3.0框架的打包插件,该插件设计用于Visual Studio 2010及更高版本。ASP.NET MVC是一种基于Model-View-Controller(模型-...

    看透Spring MVC源代码分析与实践

    看透Spring MVC源代码分析与实践 看透Spring MVC源代码分析与实践

    MVC网站管理系统MVC采集插件

    MVC采集插件依托于天目MVC网站管理系统或者天目MVC网站管理系统Home版才可运行 下载上面任一版本,然后将此子插件复制到app/plugin/目录下。在已经安装好上面程序的情况下进入后台网站设置-&gt;插件管理,进行安装。...

Global site tag (gtag.js) - Google Analytics