Nop的一些学习笔记

获得config文件中自定义的节点:

ConfigurationManager.GetSection("NopConfig") as NopConfig  

读取自定义配置的"NopConfig"节点 , 并转换成自定义类:NopConfig,NopConfig 继承接口 IConfigurationSectionHandler, 

在接口定义的方法 Create(object parent, object configContext, XmlNode section)中定义各属性值

 

Nop中没有__MigrationHistory表的原因:

首先Nop源码中并没有启动数据迁移(Enable-Migration),数据库的生成是通过执行CodeFirstInstallationService.cs这个类中的方法触发CodeFirst生成数据库.

 

而在CreateTablesIfNotExist.cs中,Nop使用string dbCreationScript = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript()

 

创建了所有表的sql语句,

并用context.Database.ExecuteSqlCommand(dbCreationScript) 来执行这些sql创建表,所以没有__MigrationHistory.

 

NOP中的引擎NopEngine 

在项目启动时,Application_Start()中初始化引擎上下文EngineContext,(使用单例模式)通过[MethodImpl(MethodImplOptions.Synchronized)]属性(这里相当于lock(typeof())),保证如果有多个线程同时访问时,使用同步的方式访问这个初始化方法,确保不会初始化多次,以提高系统性能。在初始化方法中,根据配置文件中的NopConfig节点的配置信息来初始化NopEngine。

其中,RunStartupTasks()方法,根据RegisterDependencies()方法中注册的ITypeFinder实例,来获取所有继承了IStartupTask的启动任务类,其中有的插件的启动任务,AutoMapper的初始化配置任务,以及最主要的数据库初始化。

 
 

(EF)数据库初始化

EFStartupTask中Execute()加载引擎上下文中的DataSettings,根据IOC中注册的IDataProvider实例获得数据库类型(Nop提供了SqlServer和SqlServerCE两种数据库的支持),IDataProvider实例SqlServerDataProvider中SetDatabaseInitializer()方法,含有数据库变更后,EF采取哪种策略来应对和新增修改数据库的SQL语句。

 

依赖注入(Autofac)

Nop 网站启动时,首先创建Nop的引擎(NopEngine),再通过读取配置NopConfig来注册各种依赖,
通过在程序集中查找继承自IDependencyRegistrar接口的类,运行Register() 注册方法进行Autofac的注册
 

路由系统

通过IRoutePublisher的实例 RoutePublisher 中的 RegisterRoutes(RouteCollection routes) 方法 ,
将所有继承 IRouteProvider 的实例通过实例中的RegisterRoutes(RouteCollection routes) 方法像routes中添加路由规则
 
 

插件管理文件 PluginManager.cs

初始化运行Initialize() 方法,读取txt文件中的插件名
 
 
 
Tips:
  1. IComparable<T>: 实现  CompareTo(object obj)方法来进行比较
  2. PreApplicationStartMethodAttribute [assembly: PreApplicationStartMethod(typeof(PluginManager), "Initialize")]  PreApplicationStartMethod 指向的方法被调用的时间发生在ASP.NET创建宿主环境时,属于比较早的时刻,在Application_Start()之前
  3. httpContext.User.Identity.IsAuthenticated 验证,需要在web.config文件中配置, 参考 http://blog.csdn.net/csethcrm/article/details/19198587
    http://www.cnblogs.com/tomin/archive/2012/01/10/2317851.html 介绍了HttpContext.User.IsInRole()为false的解决方法
posted @ 2020-10-31 11:02  question_xuhao  阅读(118)  评论(0编辑  收藏  举报