NopCommerce 1. NopCommerce Application_Start启动过程

时间:2022-09-30 04:21:09

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

 

从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()来对属性进行验证