NopCommerce 1. NopCommerce Application_Start启动过程
这里简单介绍整个启动过程,其他具体的后续讲解
从Application_Start中执行开始,一开始执行EngineContext.Initialize(false);
EngineContext 是对IEngine接口的一个封装,NopEngine则实现了IEngine接口,NopEngine主要是封装了依赖注入(autofac)和AutoMapper的方法,它可以方便呢的注册依赖注入和automapper,并且对外提供Resolve来解析
1. NopConfig:读取web.config配置
改类是实现对web.config中的自定义section NopConfig的内容的封装
NopConfig实现了IConfigurationSectionHandler.Create(),主要操作是将xmlNode的属性获取并设置到NopConfig中定义的属性中,之后就可以直接使用NopConfig获取这些配置信息
2. Singleton类,实现单例模式
该类内部是一个静态字段的IDictionary<Type,object>缓存
继承类之一Singleton<T>提供Instance 来获取和是设置IDictionary<Type,object>字段来实现单例获取和设置实例
3. IEngine 接口
该接口非常重要,主要对外提供autofac的解析服务
内部其实是实现了autofac依赖注入和automapper的注册
4. IEngine的实现类NopEngine对autofac的封装
System.Web.Mvc.DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 方法来设置DR
封装在RegisterDependencies(config)方法中,首先定义一个ContainerBuilder 实例,然后通过SetResolver来注册.
这里涉及到IDependencyRegistrar,该接口定义了Register方法,这样每个程序集中都可以实现该接口的Regiseter方法来提供具体的注册,并在此处利用反射获取这些实现类,然后统一注册
通过完成这一步之后,NopEngine又封装了autofac的Resolve方法,来提供对接口和类的实现类的解析工作
5. NopEngine中AutoMapper的注册
这里主要涉及的接口是IMapperConfiguration,该接口提供GetConfiguration方法
基本思路也是利用反射,得到所有IMapperConfiguration的实现类,然后执行GetConfiguration,再调用AutoMapperConfiguration.Init()初始化这一步的返回值,这样就完成了AutoMapper的注册
6. NopEngine中启动IStartupTask
涉及到IStartupTask接口,提供一个Execute方法
利用反射可以找到6个实现类
1. EfStartUpTask
SetDatabaseInitializer()方法实现对数据库的初始化,主要是将~/App_Data/Install/SqlServer.Indexes.sql 或SqlServer.StoredProcedures.sql 中的sql语句执行
7. 对ViewEngines 添加自定义ThemeableRazorViewEngine
主要涉及的接口是IViewEngine,提供了FindView(),FindPartialview(),ReleaseView() 三个方法
IViewEngine ->
VirtualPathProviderViewEngine –>
ThemeableVirtualPathProviderViewEngine –>
ThemeableRazorViewEngine
8. 设置MetadataProvider
System.Web.Mvc.ModelMetadataProviders.Current = new NopMetadataProvider();
9. 路由设置
1. Area注册,主要是为Nop.Admin注册后台页面的路由
本质是向RouteTable中添加一条RouteData的记录而已
2. 默认路由注册
其中的IgnoreRoute也是添加一条RouteData记录
主要涉及Nop.Web的路由注册,以及插件的路由注册
IRoutePublish接口封装了对IRouteProvider接口,能够帮助完成路由注册操作
插件路由注册是通过反射获取IRouteProvider接口的实现类,然后执行其中的RegisterRoutes()方法来注册路由
IRouteProvider非常重要,是所有的路由的注册信息所在
10. 添加Fluent Validation
ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new NopValidatorFactory()));
NopValidatorFactory 类继承了AttributedValidatorFactory,重写了GetValidator方法,该方法主要是获取要验证的Model的定义的Attribute属性,这些Attribute都是实现了FluentValidation.IValidator接口
在IValidator接口的实现类的构造函数中使用RuleFor()来对属性进行验证
NopCommerce 1. NopCommerce Application_Start启动过程的更多相关文章
- zookeeper源码分析之一服务端启动过程
zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...
- [原] KVM 虚拟化原理探究(2)— QEMU启动过程
KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...
- Openfire的启动过程与session管理
说明 本文源码基于Openfire4.0.2. Openfire的启动 Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...
- 探索 Linux 系统的启动过程
引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...
- Linux内核启动过程概述
版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...
- SpringMVC启动过程详解(li)
通过对SpringMVC启动过程的深入研究,期望掌握Java Web容器启动过程:掌握SpringMVC启动过程:了解SpringMVC的配置文件如何配置,为什么要这样配置:掌握SpringMVC是如 ...
- Android源码——Activity组件的启动过程
根Activity启动过程 Launcher启动MainActivity的过程主要分为6个步骤: 一.Launcher向ActivityManagerService发送一个启动MainActivity ...
- Netty源码分析之客户端启动过程
一.先来看一下客户端示例代码. public class NettyClientTest { public void connect(int port, String host) throws Exc ...
- linux源码分析(二)-启动过程
前置:这里使用的linux版本是4.8,x86体系. 这篇是 http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 的学习笔记. ...
随机推荐
- 结对编程1 —— 基于GUI和Swing的四则运算题目生成器
合作伙伴 201421123102 王艳秋 201421123106 陈 雄 代码地址 题目描述 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI( ...
- 【Beta】 第三次Daily Scrum Meeting
一.本次会议为第三次meeting会议 二.时间:10:00AM-10:20AM 地点:禹州楼 三.会议站立式照片 四.今日任务安排 成员 昨日任务 今日任务 林晓芳 查询app提醒功能模块和用户登录 ...
- 201521123035《Java程序设计》第六周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- 201521123103 《Java学习笔记》 第五次学习总结
一.本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. (1).接口更灵活.更方便,可以方便的为现有的系统添加新的功能. (2).is-a ...
- Java补码表和位移运算符
在java中数据都是以二进制的形式保存的. 但是我们看到的数据怎么是10进制的? 因为java展示之前会自动调用toString()方法 这里以4位2进制为例,4位2进制只能表示16个数,即0-15. ...
- 201521123005《Java程序设计》第十三周学习总结
1. 本周学习总结 1.网络基本概念 2.网络常用命令 ipconfig 查看网络配置信息,如ip地址 ping 测试网络是否连通 telnet 远程登录 ftp 登陆ftp Fport (xp下)查 ...
- allego 输出报告说明
List of Available Reports Assigned Function Report Lists all assigned functions, sorted by function ...
- python实例编写(1)--浏览器操作,元素操作
一.浏览器操作 1. back()与 forward() #coding=gbk //编码不一定是utf-8 from selenium import webdriver //导入包,也叫”模组“ ...
- 鸟哥Linux学习笔记04
1, . 当前目录 ..上层目录 2, 目录的相关操作 1)cd(切换目录) [root@node1 ~]# cd [相对路径或绝对路径] [root@node1 ~]# cd : 回到自 ...
- idea启动tomcat报错:Error during artifact deployment. See server log for details.
出现这种情况的原因老夫猜想是改变了artifact然而tomcat的配置中的artifact没有重新配就会出现这种报错 打开tomcat配置 删除原来的artifact 新添加artifact 保存 ...