- 浏览: 84706 次
文章分类
- 全部博客 (136)
- 我的技术资料收集 (98)
- 具体技术 (1)
- 的技术资料收集 (4)
- All Articles (1)
- 机器学习 Machine Learning (1)
- 网络编程 (1)
- java (2)
- ava (1)
- 零散技术 (1)
- C# (3)
- 技术资料收集 (1)
- CQRS (1)
- 数据库技术(MS SQL) (1)
- .Net微观世界 (1)
- Oracle SQL学习之路 (1)
- C/C++ (1)
- JS/JQ (1)
- Js封装的插件/实例/方法 (2)
- 敏捷个人 (2)
- Javascript (1)
- 程序设计---设计模式 (1)
- Bug (1)
- 未知分类 (1)
- 程序设计 (1)
- Sharepoint (1)
- Computer Graphic (1)
- IT产品 (1)
- [06]JS/jQuery (1)
- [07]Web开发 (1)
- .NET Solution (1)
- Android (3)
- 机器学习 (1)
- 系统框架设计 (1)
- Others (1)
- 算法 (1)
- 基于Oracle Logminer数据同步 (1)
- 网页设计 (1)
- 原创翻译 (1)
- EXTJS (1)
- Jqgrid (1)
- 云计算 (1)
最新评论
基本原理
插件话的应用程序一般都是先定义插件接口,然后把插件编译的dll放到固定的目录中,应用程序主程序通过加载那些实现了插件接口的dll来实现插件的使用。NopCommerce也是这样,但作为MVC Web应用程序会有一些不一样,首先是不同信任级别(Full Trust,Medium Trust)的时候加载dll的策略会有不一样,另外就是怎样显示插件中的View的问题。
放插件的文件夹
NopCommerce的插件放在网站主目录的Plugins目录下,Plugins下面有很多文件夹,一个插件类库就是一个文件夹。在插件类库中修改编译输出的地址为网站主目录的Plugins文件夹,这样插件生成的dll就能自动在目标文件夹下面。如下图:
另一个文件夹是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里面的属性。
定义插件中的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相关插件的部分代码摘取了出来,可以从这里下载。
发表评论
-
C#WebBrowser控件使用教程与技巧收集--苏飞收集 - sufeinet
2013-06-28 12:07 1077原帖地址:http://www.cnblogs.com/suf ... -
我要喷一个自认为很垃圾的网站架构 - 老赵【苏州】
2013-06-28 12:01 1139原帖地址:http://www.cnblogs.com/lao ... -
[翻译] Oracle Database 12c 新特性Multitenant - Cheney Shue
2013-06-28 11:43 627原帖地址:http://www.cnblogs.com/ese ... -
memcahd 命令操作详解 - 阿正-WEB
2013-06-28 11:37 477原帖地址:http://www.cnblogs.com/azh ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 601原帖地址:http://www.cnblogs.com/ste ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 564原帖地址:http://www.cnblogs.com/ste ... -
RPG游戏之组队测试 - zthua
2013-06-27 10:22 562原帖地址:http://www.cnblogs.com/zth ... -
IT人们给个建议 - SOUTHER
2013-06-26 14:06 527原帖地址:http://www.cnblogs.com/sou ... -
Java向前引用容易出错的地方 - 银河使者
2013-06-26 14:00 499原帖地址:http://www.cnblogs.com/nok ... -
使用Func<T1, T2, TResult> 委托返回匿名对象 - 灰身
2013-06-26 13:54 806原帖地址:http://www.cnblo ... -
【web前端面试题整理03】来看一点CSS相关的吧 - 叶小钗
2013-06-25 10:45 791原帖地址:http://www.cnblogs.com/yex ... -
Windows 8 动手实验系列教程 实验6:设置和首选项 - zigzagPath
2013-06-25 10:27 625原帖地址:http://www.cnblogs.com/zig ... -
闲聊可穿戴设备 - shawn.xie
2013-06-25 10:21 571原帖地址:http://www.cnblo ... -
CentOS下Mysql安装教程 - 小学徒V
2013-06-23 15:24 614原帖地址:http://www.cnblogs.com/xia ... -
vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化) - skyme
2013-06-23 15:18 842原帖地址:http://www.cnblogs.com/sky ... -
之前专门为IE6、7开发的网站如何迁移到IE10及可能遇到的问题和相应解决方案汇总 - 海之澜
2013-06-23 15:12 960原帖地址:http://www.cnblogs.com/wuz ... -
Android学习笔记--解析XML之SAX - 承香墨影
2013-06-23 15:01 414原帖地址:http://www.cnblo ... -
SQL Server 性能优化之——T-SQL TVF和标量函数
2013-06-19 09:32 678原帖地址:http://www.cnblogs.com/Boy ... -
Nginx学习笔记(二) Nginx--connection&request
2013-06-19 09:26 677原帖地址:http://www.cnblogs.com/cod ... -
从郭美美霸气侧漏看项目管理之项目经理防身术
2013-06-19 09:20 505原帖地址:http://www.cnblogs.com/had ...
相关推荐
"ASP.NET MVC 插件"标签则进一步强调了这个压缩包的核心内容是与ASP.NET MVC相关的扩展工具或组件,这可能包括视图引擎增强、路由管理工具、身份认证机制、缓存策略等。这些插件通常通过NuGet包管理器进行安装,也...
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 4 插件化架构简单实现 ASP.NET MVC 4 插件化架构简单实现-思路篇 http://blog.csdn.net/hao_ds/article/details/42102969 ASP.NET MVC 4 插件化架构简单实现-实例篇 ...
**MVC3版本插件安装包详解** **一、什么是MVC3** MVC(Model-View-Controller)是一种设计模式,广泛应用于Web应用程序开发,尤其是.NET Framework中的ASP.NET平台。MVC3是Microsoft在ASP.NET MVC框架上的第三个...
基于unity3D轻量级MVC的消息机制,可用于轻量级的开发。 也适合初中级程序猿来学习理解MVC框架。
本文将深入探讨如何在ASP.NET MVC中实现插件化,特别是动态加载外部插件的机制。 首先,理解插件化的核心思想是关键。插件通常是一个独立的代码单元,它能提供特定的功能,并可以通过API与主应用进行交互。在ASP...
### MVC路由机制详解 #### 一、概述 MVC(Model-View-Controller)是一种流行的软件架构模式,常被应用于Web应用开发中。MVC模式将应用分为三个核心部分:模型(Model)、视图(View)与控制器(Controller)。...
在本文中,我们将深入探讨MVC事件机制的底层架构,并结合“BearRun”项目中的实践,来理解如何修复bug并优化系统性能。** **一、MVC事件机制概述** 在MVC模式中,事件机制是连接模型、视图和控制器的重要桥梁。它...
为了在VS2010中开始使用MVC,你需要安装相应的插件来扩展IDE的功能。这个压缩包文件包含了帮助你开始MVC项目的必要组件和资源。 首先,让我们详细了解一下MVC框架。MVC是一种设计模式,它将应用程序分为三个主要...
在这个"简易插件系统示例"中,我们将探讨如何在Asp.NET MVC环境中创建一个可扩展、模块化的插件架构。 首先,让我们理解什么是插件系统。插件系统是一种允许应用程序通过安装额外的代码模块(即插件)来增加功能的...
标题中的“插件”可能指的是该压缩包包含ASP.NET MVC 3.0的安装程序和可能的扩展或工具。"AspNetMVC3Setup.exe"很可能是ASP.NET MVC 3.0的主要安装程序,而"AspNetMVC3Setup_CHS.exe"可能是中文版的安装程序,方便...
本文将详细探讨如何使用MEF与Autofac在MVC项目中协同工作来构建插件化的应用。 首先,让我们了解MEF。MEF提供了一种机制,使得应用程序能够动态地发现、加载和组合外部组件,这些组件可以是单独的类库或整个应用...
总结来说,"mvc验证码源码及插件"是一个为MVC应用提供验证码功能的工具,它包括一个可以直接引用的插件和源码,方便开发者快速实现验证码功能,增强网站的安全性。通过对源码的学习,开发者可以深入了解验证码的生成...
ExtJs 4 用了一段时间了,今天研究了下ExtJs4的MVC机制,感觉还挺好,建议大家尝试,所以就写了一个demo,帮助那些对ExtJs还不是很懂,或者想用ExtJs4却又不知道怎么做好的朋友。。。多余话不说了大家如果有什么不...
在这个"asp.net mvc 皮肤机制实现例子"中,我们将探讨如何在ASP.NET MVC应用中实现皮肤(或主题)机制,使得用户界面可以根据用户需求或特定场景进行定制。 皮肤或主题通常指的是应用的外观和感觉,包括颜色、字体...
标题中的“mvc 3.0 (打包插件) 适用于2010 以上”指的是这是一个针对Microsoft ASP.NET MVC 3.0框架的打包插件,该插件设计用于Visual Studio 2010及更高版本。ASP.NET MVC是一种基于Model-View-Controller(模型-...
看透Spring MVC源代码分析与实践 看透Spring MVC源代码分析与实践
MVC采集插件依托于天目MVC网站管理系统或者天目MVC网站管理系统Home版才可运行 下载上面任一版本,然后将此子插件复制到app/plugin/目录下。在已经安装好上面程序的情况下进入后台网站设置->插件管理,进行安装。...