这里简单介绍整个启动过程,其他具体的后续讲解
从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()来对属性进行验证