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生成数据库.
创建了所有表的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)
路由系统
插件管理文件 PluginManager.cs
- IComparable<T>: 实现 CompareTo(object obj)方法来进行比较
-
PreApplicationStartMethodAttribute [assembly: PreApplicationStartMethod(typeof(PluginManager), "Initialize")] PreApplicationStartMethod 指向的方法被调用的时间发生在ASP.NET创建宿主环境时,属于比较早的时刻,在Application_Start()之前
- 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的解决方法