nop怎么根据 js实现的商品类别筛选 找到 controller

Posts - 171,
Articles - 2,
Comments - 51
09:17 by xchit, ... 阅读,
NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入、Setter注入和构造函数注入。
NopCommerce将所有和Autofac注入相关的工作都放到了EngineContext中,在Global.asax的Application_Start函数的第一句代码即是:
//initialize engine context
EngineContext.Initialize(false);
从这里开始EngineContext的初始化工作,初始化时会创建一个新的NopEngine,参数false指定当NopEngine不为空时是否重新生成一个新的NopEngine。
[MethodImpl(MethodImplOptions.Synchronized)]
public static IEngine Initialize(bool forceRecreate)
if (Singleton&IEngine&.Instance == null || forceRecreate)
var config = ConfigurationManager.GetSection("NopConfig") as NopC
Debug.WriteLine("Constructing engine " + DateTime.Now);
Singleton&IEngine&.Instance = CreateEngineInstance(config);
Debug.WriteLine("Initializing engine " + DateTime.Now);
Singleton&IEngine&.Instance.Initialize(config);
return Singleton&IEngine&.I
NopEngine使用单例模式,在整个程序运行期间存在一个实例,代码首先会判断NopEngine是否为空,为空的话则根据web.config中配置的NopConfig节点信息创建一个新的NopEngine实例,然后对该实例进行初始化操作。web.config中的配置信息如下:
&configSections&
&section name="NopConfig" type="Easy.Core.Configuration.NopConfig, Easy.Core" requirePermission="false" /&
&/configSections&
&NopConfig&
&DynamicDiscovery Enabled="true" /&
&Engine Type="" /&
&Themes basePath="~/Themes/" /&
&/NopConfig&
CreateEngineInstance函数中使用new NopEngine()创建了一个NopEngine实例,在NopEngine的构造函数处对Autofac的容器(Container)作了初始化,如下代码:
public NopEngine(EventBroker broker, ContainerConfigurer configurer)
var config = ConfigurationManager.GetSection("NopConfig") as NopC
InitializeContainer(configurer, broker, config);
private void InitializeContainer(ContainerConfigurer configurer, EventBroker broker, NopConfig config)
var builder = new ContainerBuilder();
_containerManager = new ContainerManager(builder.Build());
configurer.Configure(this, _containerManager, broker, config);
NopCommerce通过ContainerManager对容器做了一层封装,方便对其他类型的IOC框架的扩充和支持。Configure函数完成了所有依赖的注入,同时查找所有实现了IDependencyRegistrar接口的类,并调用其Register方法,注册内容包括Http context、web helper、controller、data layer、plugin、cache manager、work context、services、settings、event consumers等等。
关于ContainerManager/ContainerConfigurer和IDependencyRegistrar是实现IOC的关键,下面对这两个部分做详细的讨论。
IOC中文名被称作控制反转(Inversion of Control),DI被称为依赖注入(Dependency Injection),可参考Martin Fowler的这篇文章来了解这两个概念:IoC容器和DependencyInjection模式。使用控制反转模式开发项目流程是先建立接口,然后再实现类,或许有人不习惯这样的开发方法,但在规模较大的软件架构中,这种方法却可以有效的降低类之间的互相依赖的情况,不但能增加架构的弹性,也能有效的降低软件的复杂度。
如果不考虑控制反转的情况,采用直接创建类,并直接在应用层调用该类,如此一来,应用层的对象就会与BLL(业务逻辑层)对象高度依赖,这样的依赖&会导致这两个类无法拆开,从而增加了这个类的维护难度,同时导致了单元测试难以进行。为了解决耦合度问题,从而引入了控制反转的概念。
Autofac介绍
&Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET、Unity、Castle等,它更显得轻量级,同时保证了高性能。它具有以下优点:
和C#语言联系紧密,可以使用C#语言的很多特性,譬如Lambda表达式等;
较低的学习曲线,只需了解IoC和DI的概念以及在何时需要使用它们即可;
XML配置支持;
自动装配;
与ASP.NET MVC3集成;(Orchard也是使用Autofac实现IOC的)
在MVC3项目中使用Autofac
&在MVC3工程中使用Autofac的最好也是最简单的方法是使用NuGet来安装Autofac.Mvc3,安装完成以后,在Global.asax的Application_Start方法中添加如下代码:
protected&void&Application_Start()&&
&&&&var&builder&=&new&ContainerBuilder();&&
&&&&builder.RegisterControllers(typeof(MvcApplication).Assembly);&&
&&&&var&container&=&builder.Build();&&
&&&&DependencyResolver.SetResolver(new&AutofacDependencyResolver(container));&&
这样就开启了Controller的依赖注入功能。其中的DependencyResolver是一个全局静态类,MVC3提供了对依赖注入的支 持,SetResolver函数用于设置使用哪个Resolver(解析器)来进行依赖注入,这里使用的是Autofac的依赖注入解析器。如果要使用自 己的解析器,必须在这里使用SetResolver函数设置。
1.&注册Controller
可以使用下面的方法对特定的Controller进行注册:
var&builder&=&&new&ContainerBuilder();&&
builder.RegisterType&HomeController&().InstancePerRequest();&&
同时可以使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册:&&
var&builder&=&new&ContainerBuilder();&&
builder.RegisterControllers(Assembly.GetExecutingAssembly());&&
2. 注册Model Binder
与控制器的注册类似,模型绑定也可以再Global.asax.cs中注册。您可以通过如下操作完成整个程序集的注册:
var&builder&=&newContainerBuilder();&&
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());&&
builder.RegisterModelBinderProvider();&&
您也必须记住使用RegisterModelBinderProvider扩展方法来注册RegisterModelBinderProvider。这个方法用是Autofac对IModelBinderProvider接口的实现。
因为RegisterModelBinders扩展方法通过扫描程序集来添加模型绑定的,所以您需要指定IModelBuilder注册的目标类是什么类型。
[ModelBinderType(typeof(string))]&&
public&class&StringBinder&:&IModelBinder&&
&&&&public&override&object&BindModel(ControllerContext&controllerContext,ModelBindingContext&bindingContext)&&
多行的ModelBuilderTypeAttribute实例可以添加到需要对个类型注册的类中。
3.&注入HTTP抽象类
MVC集成的Autofac模块将会为HTTP抽象类添加HTTP 请求的生命收起范围内的注册。包括依稀抽象类:
HttpContextBase
HttpRequestBase
HttpResponseBase
HttpServerUtilityBase
HttpSessionStateBase
HttpApplicationStateBase
HttpBrowserCapabilitiesBase
HttpCachePolicyBase
VirtualPathProvider
需要使用上面的抽象应该使用容器的RegisterModule方法来添加AutofacWebTypesModule
builder.RegisterModule(newAutofacWebTypesModule());&&
4.&注入View page
您可以通过在容器创建之前添加ViewRegistrationSource&到容器中使属性注入来使MVC页面可用。
builder.RegisterSource(newViewRegistrationSource());&&
您的viewpage必须继承MVC类中用于创建,当使用Razor试图引擎时将需要继承WebViewPage类:
public&abstract&class&CustomViewPage&:&WebViewPage&&
&&&&public&IDependencyDependency&{&&&}&&
当使用的是webform的试图引擎时,ViewPage,ViewMasterPage和ViewUserControl类都得到相应的支持。
public&abstract&class&CustomViewPage&:&ViewPage&&
&&&&public&IDependencyDependency&{&&&}&&
必须确保您实际的试图页面继承了您自定义的基类。在Razor视图引擎.cshtml中可以使用@inherits指令来实现:
@inherits&Example.Views.Shared.CustomViewPage&&
使用webform时可以做如下设置
&%@&PageLanguage="C#"&MasterPageFile="~/Views/Shared/Site.Master"&Inherits="Example.Views.Shared.CustomViewPage"&%&&&
5. 对Filter Attribute进行属性注入
为过滤器使用属性注入必须在容器创建之前调用RegisterFilterProvider方法,并将其传到AutofacDependencyResolver
ContainerBuilder&builder&=&new&ContainerBuilder();&&
builder.RegisterControllers(Assembly.GetExecutingAssembly());&&
builder.Register(c&=&&new&Logger()).As&ILogger&().InstancePerHttpRequest();&&
builder.RegisterFilterProvider();&&
IContainer&container&=&builder.Build();&&
DependencyResolver.SetResolver(new&AutofacDependencyResolver(container));&&
然后您就可以为您的过滤器添加属性了,并且
public&class&CustomActionFilter&:&ActionFilterAttribute&&
&&&&public&ILogger&Logger&{&&&}&&
&&&&public&override&void&OnActionExecuting(ActionExecutingContext&filterContext)&&
&&&&&&&&Logger.Log("OnActionExecuting");&&
下面是类似用户验证过滤器的自定义特性
public&class&CustomAuthorizeAttribute&:&AuthorizeAttribute&&
&&&&public&ILogger&Logger&{&&&}&&
&&&&protected&override&bool&AuthorizeCore(HttpContextBase&httpContext)&&
&&&&&&&&Logger.Log("AuthorizeCore");&&
&&&&&&&&return&&&
应用如下:
[CustomActionFilter]&&
[CustomAuthorizeAttribute]&&
public&ActionResult&Index()&&
关于Autofac更多的信息,可以参考autofac在google&code上的wiki文档:http:
NopCommerce是如何使用Autofac实现依赖注入的?
&NopCommerce将所有和Autofac注入相关的工作都放到了EngineContext中,在Global.asax的Application_Start函数的第一句代码即是:
EngineContext.Initialize(false);&&
从这里开始EngineContext的初始化工作,初始化时会创建一个新的NopEngine,参数false指定当NopEngine不为空时是否重新生成一个新的NopEngine。
[MethodImpl(MethodImplOptions.Synchronized)]&&
public&static&IEngine&Initialize(bool&forceRecreate)&&
&&&&if&(Singleton&IEngine&.Instance&==&null&||&forceRecreate)&&
&&&&&&&&var&config&=&ConfigurationManager.GetSection("NopConfig")&as&NopC&&
&&&&&&&&Debug.WriteLine("Constructing&engine&"&+&DateTime.Now);&&
&&&&&&&&Singleton&IEngine&.Instance&=&CreateEngineInstance(config);&&
&&&&&&&&Debug.WriteLine("Initializing&engine&"&+&DateTime.Now);&&
&&&&&&&&Singleton&IEngine&.Instance.Initialize(config);&&
&&&&return&Singleton&IEngine&.I&&
NopEngine&使用单例模式,在整个程序运行期间存在一个实例,代码首先会判断NopEngine是否为空,为空的话则根据web.config中配置的 NopConfig节点信息创建一个新的NopEngine实例,然后对该实例进行初始化操作。web.config中的配置信息如下:
&&&configSections&&&
&&&&&section&name="NopConfig"&type="Easy.Core.Configuration.NopConfig,&Easy.Core"&requirePermission="false"&/&&&
&&&/configSections&&&
&&&NopConfig&&&
&&&&&DynamicDiscovery&Enabled="true"&/&&&
&&&&&Engine&Type=""&/&&&
&&&&&Themes&basePath="~/Themes/"&/&&&
&&&/NopConfig&&&
CreateEngineInstance函数中使用new NopEngine()创建了一个NopEngine实例,在NopEngine的构造函数处对Autofac的容器(Container)作了初始化,如下代码:
public&NopEngine(EventBroker&broker,&ContainerConfigurer&configurer)&&
&&&&var&config&=&ConfigurationManager.GetSection("NopConfig")&as&NopC&&
&&&&InitializeContainer(configurer,&broker,&config);&&
private&void&InitializeContainer(ContainerConfigurer&configurer,&EventBroker&broker,&NopConfig&config)&&
&&&&var&builder&=&new&ContainerBuilder();&&
&&&&_containerManager&=&new&ContainerManager(builder.Build());&&
&&&&configurer.Configure(this,&_containerManager,&broker,&config);&&
NopCommerce通过ContainerManager对容器做了一层封装,方便对其他类型的IOC框架的扩充和支持。Configure函数完成了所有依赖的注入,同时查找所有实现了IDependencyRegistrar接 口的类,并调用其Register方法,注册内容包括Http context、web helper、controller、data layer、plugin、cache manager、work context、services、settings、event consumers等等。
关于ContainerManager/ContainerConfigurer和IDependencyRegistrar是实现IOC的关键,下面对这两个部分做详细的讨论。
// todo:仍需继续分析具体实现
ContainerManager/ContainerConfigurer
ContainerManagerContainerManager对依赖注入中使用的容器做了一层封装,提供了这些函数:&&
AddComponent/AddComponentInstance/AddComponentWithParameters
Resolve/ResolveAll/ResovleUnregistered
UpdateContainer
DependencyRegistrar
web helper
controller
data layer
cache manager
work context
event consumers
from:aneasystone ==&/aneasystone/archive//2659176.html
IOC中文名被称作控制反转(Inversion of Control),DI被称为依赖注入(Dependency Injection),可参考Martin Fowler的这篇文章来了解这两个概念:IoC容器和DependencyInjection模式。使用控制反转模式开发项目流程是先建立接口,然后再实现类,或许有人不习惯这样的开发方法,但在规模较大的软件架构中,这种方法却可以有效的降低类之间的互相依赖的情况,不但能增加架构的弹性,也能有效的降低软件的复杂度。
如果不考虑控制反转的情况,采用直接创建类,并直接在应用层调用该类,如此一来,应用层的对象就会与BLL(业务逻辑层)对象高度依赖,这样的依赖&会导致这两个类无法拆开,从而增加了这个类的维护难度,同时导致了单元测试难以进行。为了解决耦合度问题,从而引入了控制反转的概念。
Autofac介绍
&Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET、Unity、Castle等,它更显得轻量级,同时保证了高性能。它具有以下优点:
和C#语言联系紧密,可以使用C#语言的很多特性,譬如Lambda表达式等;
较低的学习曲线,只需了解IoC和DI的概念以及在何时需要使用它们即可;
XML配置支持;
自动装配;
与ASP.NET MVC3集成;(Orchard也是使用Autofac实现IOC的)
在MVC3项目中使用Autofac
&在MVC3工程中使用Autofac的最好也是最简单的方法是使用NuGet来安装Autofac.Mvc3,安装完成以后,在Global.asax的Application_Start方法中添加如下代码:
protected&void&Application_Start()&&
&&&&var&builder&=&new&ContainerBuilder();&&
&&&&builder.RegisterControllers(typeof(MvcApplication).Assembly);&&
&&&&var&container&=&builder.Build();&&
&&&&DependencyResolver.SetResolver(new&AutofacDependencyResolver(container));&&
这样就开启了Controller的依赖注入功能。其中的DependencyResolver是一个全局静态类,MVC3提供了对依赖注入的支 持,SetResolver函数用于设置使用哪个Resolver(解析器)来进行依赖注入,这里使用的是Autofac的依赖注入解析器。如果要使用自 己的解析器,必须在这里使用SetResolver函数设置。
1.&注册Controller
可以使用下面的方法对特定的Controller进行注册:
var&builder&=&&new&ContainerBuilder();&&
builder.RegisterType&HomeController&().InstancePerRequest();&&
同时可以使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册:&&
var&builder&=&new&ContainerBuilder();&&
builder.RegisterControllers(Assembly.GetExecutingAssembly());&&
2. 注册Model Binder
与控制器的注册类似,模型绑定也可以再Global.asax.cs中注册。您可以通过如下操作完成整个程序集的注册:
var&builder&=&newContainerBuilder();&&
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());&&
builder.RegisterModelBinderProvider();&&
您也必须记住使用RegisterModelBinderProvider扩展方法来注册RegisterModelBinderProvider。这个方法用是Autofac对IModelBinderProvider接口的实现。
因为RegisterModelBinders扩展方法通过扫描程序集来添加模型绑定的,所以您需要指定IModelBuilder注册的目标类是什么类型。
[ModelBinderType(typeof(string))]&&
public&class&StringBinder&:&IModelBinder&&
&&&&public&override&object&BindModel(ControllerContext&controllerContext,ModelBindingContext&bindingContext)&&
多行的ModelBuilderTypeAttribute实例可以添加到需要对个类型注册的类中。
3.&注入HTTP抽象类
MVC集成的Autofac模块将会为HTTP抽象类添加HTTP 请求的生命收起范围内的注册。包括依稀抽象类:
HttpContextBase
HttpRequestBase
HttpResponseBase
HttpServerUtilityBase
HttpSessionStateBase
HttpApplicationStateBase
HttpBrowserCapabilitiesBase
HttpCachePolicyBase
VirtualPathProvider
需要使用上面的抽象应该使用容器的RegisterModule方法来添加AutofacWebTypesModule
builder.RegisterModule(newAutofacWebTypesModule());&&
4.&注入View page
您可以通过在容器创建之前添加ViewRegistrationSource&到容器中使属性注入来使MVC页面可用。
builder.RegisterSource(newViewRegistrationSource());&&
您的viewpage必须继承MVC类中用于创建,当使用Razor试图引擎时将需要继承WebViewPage类:
public&abstract&class&CustomViewPage&:&WebViewPage&&
&&&&public&IDependencyDependency&{&&&}&&
当使用的是webform的试图引擎时,ViewPage,ViewMasterPage和ViewUserControl类都得到相应的支持。
public&abstract&class&CustomViewPage&:&ViewPage&&
&&&&public&IDependencyDependency&{&&&}&&
必须确保您实际的试图页面继承了您自定义的基类。在Razor视图引擎.cshtml中可以使用@inherits指令来实现:
@inherits&Example.Views.Shared.CustomViewPage&&
使用webform时可以做如下设置
&%@&PageLanguage="C#"&MasterPageFile="~/Views/Shared/Site.Master"&Inherits="Example.Views.Shared.CustomViewPage"&%&&&
5. 对Filter Attribute进行属性注入
为过滤器使用属性注入必须在容器创建之前调用RegisterFilterProvider方法,并将其传到AutofacDependencyResolver
ContainerBuilder&builder&=&new&ContainerBuilder();&&
builder.RegisterControllers(Assembly.GetExecutingAssembly());&&
builder.Register(c&=&&new&Logger()).As&ILogger&().InstancePerHttpRequest();&&
builder.RegisterFilterProvider();&&
IContainer&container&=&builder.Build();&&
DependencyResolver.SetResolver(new&AutofacDependencyResolver(container));&&
然后您就可以为您的过滤器添加属性了,并且
public&class&CustomActionFilter&:&ActionFilterAttribute&&
&&&&public&ILogger&Logger&{&&&}&&
&&&&public&override&void&OnActionExecuting(ActionExecutingContext&filterContext)&&
&&&&&&&&Logger.Log("OnActionExecuting");&&
下面是类似用户验证过滤器的自定义特性
public&class&CustomAuthorizeAttribute&:&AuthorizeAttribute&&
&&&&public&ILogger&Logger&{&&&}&&
&&&&protected&override&bool&AuthorizeCore(HttpContextBase&httpContext)&&
&&&&&&&&Logger.Log("AuthorizeCore");&&
&&&&&&&&return&&&
应用如下:
[CustomActionFilter]&&
[CustomAuthorizeAttribute]&&
public&ActionResult&Index()&&
关于Autofac更多的信息,可以参考autofac在google&code上的wiki文档:http:
NopCommerce是如何使用Autofac实现依赖注入的?
&NopCommerce将所有和Autofac注入相关的工作都放到了EngineContext中,在Global.asax的Application_Start函数的第一句代码即是:
EngineContext.Initialize(false);&&
从这里开始EngineContext的初始化工作,初始化时会创建一个新的NopEngine,参数false指定当NopEngine不为空时是否重新生成一个新的NopEngine。
[MethodImpl(MethodImplOptions.Synchronized)]&&
public&static&IEngine&Initialize(bool&forceRecreate)&&
&&&&if&(Singleton&IEngine&.Instance&==&null&||&forceRecreate)&&
&&&&&&&&var&config&=&ConfigurationManager.GetSection("NopConfig")&as&NopC&&
&&&&&&&&Debug.WriteLine("Constructing&engine&"&+&DateTime.Now);&&
&&&&&&&&Singleton&IEngine&.Instance&=&CreateEngineInstance(config);&&
&&&&&&&&Debug.WriteLine("Initializing&engine&"&+&DateTime.Now);&&
&&&&&&&&Singleton&IEngine&.Instance.Initialize(config);&&
&&&&return&Singleton&IEngine&.I&&
NopEngine&使用单例模式,在整个程序运行期间存在一个实例,代码首先会判断NopEngine是否为空,为空的话则根据web.config中配置的 NopConfig节点信息创建一个新的NopEngine实例,然后对该实例进行初始化操作。web.config中的配置信息如下:
&&&configSections&&&
&&&&&section&name="NopConfig"&type="Easy.Core.Configuration.NopConfig,&Easy.Core"&requirePermission="false"&/&&&
&&&/configSections&&&
&&&NopConfig&&&
&&&&&DynamicDiscovery&Enabled="true"&/&&&
&&&&&Engine&Type=""&/&&&
&&&&&Themes&basePath="~/Themes/"&/&&&
&&&/NopConfig&&&
CreateEngineInstance函数中使用new NopEngine()创建了一个NopEngine实例,在NopEngine的构造函数处对Autofac的容器(Container)作了初始化,如下代码:
public&NopEngine(EventBroker&broker,&ContainerConfigurer&configurer)&&
&&&&var&config&=&ConfigurationManager.GetSection("NopConfig")&as&NopC&&
&&&&InitializeContainer(configurer,&broker,&config);&&
private&void&InitializeContainer(ContainerConfigurer&configurer,&EventBroker&broker,&NopConfig&config)&&
&&&&var&builder&=&new&ContainerBuilder();&&
&&&&_containerManager&=&new&ContainerManager(builder.Build());&&
&&&&configurer.Configure(this,&_containerManager,&broker,&config);&&
NopCommerce通过ContainerManager对容器做了一层封装,方便对其他类型的IOC框架的扩充和支持。Configure函数完成了所有依赖的注入,同时查找所有实现了IDependencyRegistrar接 口的类,并调用其Register方法,注册内容包括Http context、web helper、controller、data layer、plugin、cache manager、work context、services、settings、event consumers等等。
关于ContainerManager/ContainerConfigurer和IDependencyRegistrar是实现IOC的关键,下面对这两个部分做详细的讨论。
// todo:仍需继续分析具体实现
ContainerManager/ContainerConfigurer
ContainerManagerContainerManager对依赖注入中使用的容器做了一层封装,提供了这些函数:&&
AddComponent/AddComponentInstance/AddComponentWithParameters
Resolve/ResolveAll/ResovleUnregistered
UpdateContainer
DependencyRegistrar
web helper
controller
data layer
cache manager
work contextNopCommerc MVC 插件机制分析 | 查问题
汇聚最新编程技术,编程问题一网打尽
& NopCommerc MVC 插件机制分析
NopCommerc MVC 插件机制分析
[作者: 分类: ]
插件话的应用程序一般都是先定义插件接口,然后把插件编译的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 viewsvar embeddedViewResolver = EngineContext.Current.Resolve&IEmbeddedViewResolver&();var embeddedProvider = new EmbeddedViewVirtualPathProvider(embeddedViewResolver.GetEmbeddedViews());HostingEnvironment.RegisterVirtualPathProvider(embeddedProvider);
编写NopCommerce插件
可以参考。其中有一条建议非常好,就是Copy原来的插件,在上面修改。
把NopCommerce相关插件的部分代码摘取了出来,可以从下载。

我要回帖

更多关于 商品类别表 的文章

 

随机推荐