这里简单介绍整个启动过程,其他具体的后续讲解

从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启动过程的更多相关文章

  1. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  2. [原] KVM 虚拟化原理探究(2)— QEMU启动过程

    KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...

  3. Openfire的启动过程与session管理

    说明   本文源码基于Openfire4.0.2.   Openfire的启动       Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...

  4. 探索 Linux 系统的启动过程

    引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...

  5. Linux内核启动过程概述

    版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...

  6. SpringMVC启动过程详解(li)

    通过对SpringMVC启动过程的深入研究,期望掌握Java Web容器启动过程:掌握SpringMVC启动过程:了解SpringMVC的配置文件如何配置,为什么要这样配置:掌握SpringMVC是如 ...

  7. Android源码——Activity组件的启动过程

    根Activity启动过程 Launcher启动MainActivity的过程主要分为6个步骤: 一.Launcher向ActivityManagerService发送一个启动MainActivity ...

  8. Netty源码分析之客户端启动过程

    一.先来看一下客户端示例代码. public class NettyClientTest { public void connect(int port, String host) throws Exc ...

  9. linux源码分析(二)-启动过程

    前置:这里使用的linux版本是4.8,x86体系. 这篇是 http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 的学习笔记. ...

随机推荐

  1. 4th-结对编程2

    0x00 Coding Coding地址/小伙伴的博客地址 合作伙伴:庞伊凡(201421123011).赵娅汀(201421123012) 0x01 题目描述 上一周大家为四则运算程序设计了2-3个 ...

  2. 201521123086 《Java程序设计》第9周学习总结

    本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. (1)使用try...catch语句捕获异常(try块后可跟一个或多个catch块,注意子类异常要放在父类异常前面,否则子 ...

  3. session和cookie介绍以及session简单应用

    介绍http协议与TCP协议:        http协议:是短连接,关闭浏览器的时候断开与服务器的连接         TCP协议:是长连接,连接一直存在         http协议是在TCP协议 ...

  4. 如何延长IntelliJ IDEA的试用期?

    想打开idea写个代码...提示idea快过期...不开森...然鹅.   根据网上各种说明,总结大体分为以下4种方法: 方法1.直接输入激活码Activation Code(亲自验证有效而且非常简单 ...

  5. XML预览

    功能:  实现模板文件的预览 模板实体类中有一个content字段,它的值是xml形式的,就是要预览它的内容; 实现思路:  在java后台中将这个xml内容以xml文件的形式保存到服务器上,然后将路 ...

  6. JPA常用注解(转载)

    转自:http://blog.csdn.net/wanghuan203/article/details/8698102 JPA全称Java Persistence API.JPA通过JDK 5.0注解 ...

  7. UVW源码漫谈(番外篇)—— Emitter

    这两天天气凉了,苏州这边连续好几天都是淅淅沥沥的下着小雨,今天天气还稍微好点.前两天早上起来突然就感冒了,当天就用了一卷纸,好在年轻扛得住,第二天就跟没事人似的.在这里提醒大家一下,天气凉了,睡凉席的 ...

  8. SSH端口转发详解及实例

    一.SSH端口转发简介 SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据.但是,SSH还能够将其他TCP端口的网络数据通SSH链接来转发,并且自动提供了相应的加密及解密服务.这一过程也被叫 ...

  9. Hive简记

    在大数据工作中难免遇到数据仓库(OLAP)架构,以及通过Hive SQL简化分布式计算的场景.所以想通过这篇博客对Hive使用有一个大致总结,希望道友多多指教! 摘要: 1.Hive安装 2.Hive ...

  10. Win7 32位系统下Sublime text 3的安装以及配置C/C++、java、python的开发环境方法

    本人初学者,此文仅是对这几天鼓捣subime text 3一点微不足道的经验总结,如有明显错误,欢迎指正! 好了,废话少说,进入正题,之前编程java一直用的是eclipse,java的主流IDE,后 ...