nopCommerce 3.9 大波浪系列 之 引擎 NopEngine
本章涉及到的内容如下
1.EngineContext初始化IEngine实例
2.Autofac依赖注入初始化
3.AutoMapper框架初始化
4.启动任务初始化
一.EngineContext初始化
nopCommerce应用启动时首先调用EngineContext.Initialize(false) 进行初始化引擎,
并对IEngine接口进行初始化。IEngine用于实现依赖注入和初始化工作。nop中使用Autofac进行依赖注入。
你会发现nop中很多如:EngineContext.Current.Resolve<ICacheManager>();这样的语句,该Resolve方法用于返回对应接口的实例。
[MethodImpl(MethodImplOptions.Synchronized)]//可以确保在不同线程中运行的该方式以同步的方式运行
public static IEngine Initialize(bool forceRecreate)
{
if (Singleton<IEngine>.Instance == null || forceRecreate)
{
Singleton<IEngine>.Instance = new NopEngine(); var config = ConfigurationManager.GetSection("NopConfig") as NopConfig;
Singleton<IEngine>.Instance.Initialize(config);
}
return Singleton<IEngine>.Instance;
}
EngineContext.Initialize(false)
二.IEngine接口初始化
NopEngine实现IEngine接口,并在Initialize(NopConfig config)方法中对应用进行初始化工作。
同时使用Resolve方法返回对应接口实例。
首先我们看下Initialize(NopConfig config)方法都做了什么。
public void Initialize(NopConfig config)
{
//register dependencies 注册依赖项 nop 使用 Autofac进行依赖注入
RegisterDependencies(config); //register mapper configurations 注册对象映射配置 nop 使用 AutoMapper进行对象映射
RegisterMapperConfiguration(config); //startup tasks 启动任务
if (!config.IgnoreStartupTasks)
{
RunStartupTasks();
} }
1.调用RegisterDependencies(config)方法进行依赖注入(IOC)初始化工作
我们先看看代码
/// <summary>
/// 使用AutoFac注册依赖项
/// 遍历所有的实现IDependencyRegistrar接口实例进行注册
/// Register dependencies
/// </summary>
/// <param name="config">Config</param>
protected virtual void RegisterDependencies(NopConfig config)
{
var builder = new ContainerBuilder(); //dependencies
var typeFinder = new WebAppTypeFinder();
builder.RegisterInstance(config).As<NopConfig>().SingleInstance();
builder.RegisterInstance(this).As<IEngine>().SingleInstance();
builder.RegisterInstance(typeFinder).As<ITypeFinder>().SingleInstance(); //register dependencies provided by other assemblies
var drTypes = typeFinder.FindClassesOfType<IDependencyRegistrar>();
var drInstances = new List<IDependencyRegistrar>();
foreach (var drType in drTypes)
drInstances.Add((IDependencyRegistrar) Activator.CreateInstance(drType));
//sort
drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList();
foreach (var dependencyRegistrar in drInstances)
dependencyRegistrar.Register(builder, typeFinder, config); var container = builder.Build();
this._containerManager = new ContainerManager(container); //set dependency resolver
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
1.默认使用Autofac依赖注入框架,因此首先创建ioc容器 var builder = new ContainerBuilder();
2.容器中注册NopConfig,IEngine,ITypeFinder。
这里重点说下ITypeFinder接口,该接用于返回程序集,获取某个接口所有实现类。该接口被广泛用在 Nop Engine中。
WebAppTypeFinder类实现了ITypeFinder接口,会获取所有”\bin”目录下*.dll 程序集,并通过反射可以获取到指定接口的实现类。
3.获取所有IDependencyRegistrar接口实现类进行初始化,再调用 Register方法在IOC容器中注册类型及其实例,
最重要的一个实现类就是“Nop.Web.Framework\DependencyRegistrar.cs”,该实现类中将nop所需要的接口实现都注册到ioc容器中。
我们在二次开发中可以创建IDependencyRegistrar的实现类添加自己的业务接口。如何注册大家学习下Autofac框架进一步了解。
下图中列出了nop项目自带的一些IDependencyRegistrar方法。
代码中也可以直接使用 EngineContext.Current.Resolve<“接口”>()进行调用,这种情况常用语视图中。

2.调用RegisterMapperConfiguration(config)方法进行对象映射
还是先看代码
/// <summary>
/// AutoMapper为对象映射
/// 遍历所有的实现IMapperConfiguration接口实例进行注册
/// Register mapping
/// </summary>
/// <param name="config">Config</param>
protected virtual void RegisterMapperConfiguration(NopConfig config)
{
//dependencies
var typeFinder = new WebAppTypeFinder(); //register mapper configurations provided by other assemblies
var mcTypes = typeFinder.FindClassesOfType<IMapperConfiguration>();
var mcInstances = new List<IMapperConfiguration>();
foreach (var mcType in mcTypes)
mcInstances.Add((IMapperConfiguration)Activator.CreateInstance(mcType));
//sort
mcInstances = mcInstances.AsQueryable().OrderBy(t => t.Order).ToList();
//get configurations
var configurationActions = new List<Action<IMapperConfigurationExpression>>();
foreach (var mc in mcInstances)
configurationActions.Add(mc.GetConfiguration());
//register
AutoMapperConfiguration.Init(configurationActions);
}
使用AutoMapper框架进行对象映射,简单些就是Dto与Model之间的转换.
这里同样使用ITypeFinder 获取所有IMapperConfiguration的实现类,并在实现类中完成Dto与Model之间的映射关系。
同样如果自行扩展IMapperConfiguration的实现类,nop在此也会自动进行配置的。

nop中只在Nop.Admin项目中使用AutoMapper进行对象映射。

而Nop.Web项目并没有使用AutoMapper而是用扩展来实现的。
3.运行启动任务
最后说下应用启动时运行启动任务
在配置类NopConfig中IgnoreStartupTasks来控制是否启动
/// <summary>
/// 启动时运行的任务任务
/// 遍历所有实现IStartupTask接口的实例
/// Run startup tasks
/// </summary>
protected virtual void RunStartupTasks()
{
var typeFinder = _containerManager.Resolve<ITypeFinder>();
var startUpTaskTypes = typeFinder.FindClassesOfType<IStartupTask>();
var startUpTasks = new List<IStartupTask>();
foreach (var startUpTaskType in startUpTaskTypes)
startUpTasks.Add((IStartupTask)Activator.CreateInstance(startUpTaskType));
//sort
startUpTasks = startUpTasks.AsQueryable().OrderBy(st => st.Order).ToList();
foreach (var startUpTask in startUpTasks)
startUpTask.Execute();
}
同样使用ITypeFinder 来获取所有 IStartupTask接口的实现类,并调用Execute()方法来执行。
三.总结:
NopEngine实现nop引擎,并通过Autofac,AutoMapper对nop进行初始化。
ITypeFinder 接口很重要,因为nop扩展功能都依赖于它来实现。nop有很好的接口截止,大家进行二次开发的时候进行接口实现就可以了,nop会自动进行初始化配置。
如果Autofac,AutoMapper中的配置不好理解可以留言一起讨论学习。
本文地址:http://www.cnblogs.com/yaoshangjin/p/7221586.html
本文为大波浪原创、转载请注明出处。
nopCommerce 3.9 大波浪系列 之 引擎 NopEngine的更多相关文章
- nopCommerce 3.9 大波浪系列 之 使用Redis主从高可用缓存
一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...
- nopCommerce 3.9 大波浪系列 之 使用部署在Docker中的Redis缓存主从服务
一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...
- nopCommerce 3.9 大波浪系列 之 global.asax
一.nop的global.asax文件 nop3.9基于ASP.NET MVC 5框架开发,而ASP.NET MVC中global.asax文件包含全局应用程序事件的事件处理程序,它响应应用程序级别和 ...
- nopCommerce 3.9 大波浪系列 之 网页加载Widgets插件原理
一.插件简介 插件用于扩展nopCommerce的功能.nopCommerce有几种类型的插件如:支付.税率.配送方式.小部件等(接口如下图),更多插件可以访问nopCommerce官网. 我们看下后 ...
- nopCommerce 3.9 大波浪系列 之 IWebHelper
接口:Nop.Core.IWebHelper 实现:Nop.Core.WebHelper 测试:Nop.Core.Tests.WebHelperTests 简介:Web辅助类 功能:获取客户端IP地址 ...
- nopCommerce 3.9 大波浪系列 之 汉化-Roxy Fileman
官网:http://www.roxyfileman.com/ 中文包:zh.json 1.将zh.json包拷贝到Nop.Admin项目中"Content\Roxy_Fileman\lang ...
- nopCommerce 3.9 大波浪系列 之 路由扩展 [多语言Seo的实现]
一.nop种的路由注册 在Global.asax,Application_Start()方法中会进行路由注册,代码如下. public static void RegisterRoutes(Route ...
- nopCommerce 3.9 大波浪系列 之 事件机制(生产者、消费者)
一.nop事件机制简介 应用场景:客户支付成功后,需要发送短信.邮件告知客户订单支付成功(短信.邮件由不同模块实现) 实现方法: 1.定义支付成功OrderPaidEvent事件. 2.定义短信,邮箱 ...
- nopCommerce 3.9 大波浪系列 之 开发支持多店的插件
一.基础介绍 nop支持多店及多语言,本篇结合NivoSlider插件介绍下如何开发支持多商城的小部件. 主要接口如下: ISettingService 接口:设置接口,可实现多店配置. (点击接口介 ...
随机推荐
- SqlDataReader 之指定转换无效
//获取最新显示顺序数据 string str = string.Format(@"if exists(select ShowOrder from GIS_FuncDefaultLayer ...
- spring-boot开发:使用内嵌容器进行快速开发及测试
一.简述一下spring-boot微框架 1.spring-boot微框架是什么? 大家都知道,在使用spring框架进行应用开发时需要很多*.xml的初始化配置文件,而springBoot就是用来简 ...
- ios移动端原生滚动条滚动不灵敏问题
最近开发微信页面的时候遇到了这个问题, 因为移动端浏览器的原生滚动条样式很好,不像pc端那么难看,所以在页面需要滚动的地方用了原生的滚动条,这种滚动条在安卓浏览器中没有任何问题,但是在ios微信浏览器 ...
- 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)
☆ 写在前面 之前答应大家的毕业答辩之后把所有文档贡献出来,现在答辩已过,LZ信守承诺,把所有文档开源到了GitHub(这个地址包含所有的代码和文档以及PPT,外层为简单的代码).还望喜欢的朋友们,不 ...
- 解决其他浏览器没有propertychange事件
监听实现: /** * Listener.js * 此类用于解决非ie下,通过js改变input的值时, * 无法触发其事件的问题(如:onpropertychange, oninput, oncha ...
- cms基本概念(dedecms,phpcms)
1.什么是cms? cms是"Content Management System"的缩写,意为"内容管理系统". 内容管理系统是企业信息化建设和电子政务的新宠, ...
- 浅谈Cordova框架的一些理解
前言 因为工作原因,最近需要研究Cordova框架,看了其中的源码和实现方式,当场在看的时候马上能理解,但是事后再回去看相关源码时候却发现之前理解的内容又忘记了,又不得不重新开始看,所以总觉得需要记录 ...
- CSS 浅析position:relative/absolute定位方式
## 一.position:relative 相对定位 ## 分两种情况分析: · 无 position: relative: · 有 position: relative. 代码如下图: 显示效果如 ...
- laravel中token的使用方式
在form表单里提交表单时,可 <form action="" method="post"> <?php echo csrf_field() ...
- 【Netty】TCP粘包和拆包
一.前言 前面已经基本上讲解完了Netty的主要内容,现在来学习Netty中的一些可能存在的问题,如TCP粘包和拆包. 二.粘包和拆包 对于TCP协议而言,当底层发送消息和接受消息时,都需要考虑TCP ...