ABP 框架从源码学习——abp框架启动和结束(1)
2017-03-07 13:03
369 查看
1.abp框架的启动是从Global.asax文件的Application_Start启动的,当然代表Global的application必须从AbpWebApplication继承:
2.Application_Start方法中主要是通过AbpBootstrapper来将各个Abpmodule模块载入Abp框架中的AbpBootstrapper类在Abp.dll中, 其主要用于框架的基本配置的注册和初始化,AbpBootstrapper调用Initialize方法初始化
而在 AbpBootstrapper.Initialize()方法在执行AbpBootstrapper的Initialize()方法时首先会执行AbpCoreInstaller的Initialize()
AbpCoreInstaller的Initialize() 主要执行的就是注册系统框架级的所有配置类,具体代码如下
3.接着解析AbpStartupConfiguration的实例调用其Initialize()来完成所有配置项的初始设值。
4.最后,IAbpModuleManager的实例调用其InitializeModules()初始化所有的Module
主意:从上面的代码可以看出,ABP框架初始化每个module时,是先完成所有Module的PreInitialize,然后再执行所有Module的Initialize,最后执行PostInitialize。不是执行完一个Module的这三个方法,再去执行下一个Module的这三个方法。
另外,AbpModule的基本信息是用AbpModuleInfo封装的,他里面其实也就是将一个abpmodule类封装成Type,Assembly以及模块的依赖模块的AbpModuleInfo等信息。
5.一旦应用程序结束将在AbpWebApplications中调用AbpBootstrapper的Dispose方法,[b]Dispose通过IAbpModuleManager,执行其ShutdownModules,关闭所有Module。[/b]
public class MvcApplication : AbpWebApplication { protected override void Application_Start(object sender, EventArgs e) { AbpBootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(f => .UseLog4Net().WithConfig("log4net.config")); base.Application_Start(sender, e); } }
2.Application_Start方法中主要是通过AbpBootstrapper来将各个Abpmodule模块载入Abp框架中的AbpBootstrapper类在Abp.dll中, 其主要用于框架的基本配置的注册和初始化,AbpBootstrapper调用Initialize方法初始化
public abstract class AbpWebApplication : HttpApplication {/// <summary> /// This method is called by ASP.NET system on web application's startup. /// </summary> protected virtual void Application_Start(object sender, EventArgs e) { ThreadCultureSanitizer.Sanitize(); AbpBootstrapper.IocManager.RegisterIfNot<IAssemblyFinder, WebAssemblyFinder>(); AbpBootstrapper.Initialize(); }
而在 AbpBootstrapper.Initialize()方法在执行AbpBootstrapper的Initialize()方法时首先会执行AbpCoreInstaller的Initialize()
public virtual void Initialize() { IocManager.IocContainer.Install(new AbpCoreInstaller()); IocManager.Resolve<AbpStartupConfiguration>().Initialize(); _moduleManager = IocManager.Resolve<IAbpModuleManager>(); _moduleManager.InitializeModules(); }
AbpCoreInstaller的Initialize() 主要执行的就是注册系统框架级的所有配置类,具体代码如下
internal class AbpCoreInstaller : IWindsorInstaller { public void Install(IWindsorContainer container, IConfigurationStore store) { container.Register( Component.For<IUnitOfWorkDefaultOptions, UnitOfWorkDefaultOptions>().ImplementedBy<UnitOfWorkDefaultOptions>().LifestyleSingleton(), Component.For<INavigationConfiguration, NavigationConfiguration>().ImplementedBy<NavigationConfiguration>().LifestyleSingleton(), Component.For<ILocalizationConfiguration, LocalizationConfiguration>().ImplementedBy<LocalizationConfiguration>().LifestyleSingleton(), Component.For<IAuthorizationConfiguration, AuthorizationConfiguration>().ImplementedBy<AuthorizationConfiguration>().LifestyleSingleton(), //此处省略若干行 ); } }
3.接着解析AbpStartupConfiguration的实例调用其Initialize()来完成所有配置项的初始设值。
4.最后,IAbpModuleManager的实例调用其InitializeModules()初始化所有的Module
public virtual void InitializeModules() { LoadAll(); var sortedModules = _modules.GetSortedModuleListByDependency(); sortedModules.ForEach(module => module.Instance.PreInitialize()); sortedModules.ForEach(module => module.Instance.Initialize()); sortedModules.ForEach(module => module.Instance.PostInitialize()); }
主意:从上面的代码可以看出,ABP框架初始化每个module时,是先完成所有Module的PreInitialize,然后再执行所有Module的Initialize,最后执行PostInitialize。不是执行完一个Module的这三个方法,再去执行下一个Module的这三个方法。
另外,AbpModule的基本信息是用AbpModuleInfo封装的,他里面其实也就是将一个abpmodule类封装成Type,Assembly以及模块的依赖模块的AbpModuleInfo等信息。
5.一旦应用程序结束将在AbpWebApplications中调用AbpBootstrapper的Dispose方法,[b]Dispose通过IAbpModuleManager,执行其ShutdownModules,关闭所有Module。[/b]
protected virtual void Application_End(object sender, EventArgs e) { AbpBootstrapper.Dispose(); }
public virtual void ShutdownModules() { var sortedModules = _modules.GetSortedModuleListByDependency(); sortedModules.Reverse(); sortedModules.ForEach(sm => sm.Instance.Shutdown()); }
相关文章推荐
- ABP 框架从源码学习——abp框架启动和结束(1)
- ABP 框架从源码学习——abp框架启动和结束(1)
- ABP 框架从源码学习——abp框架启动核心类AbpBootstrapper(2)
- ABP 框架从源码学习——abp框架启动核心类AbpBootstrapper(2)
- ABP 框架从源码学习——abp框架启动核心类AbpBootstrapper(2)
- ABP框架源码学习之修改默认数据库表前缀或表名称
- Tomcat6.0源码学习--启动框架
- [Abp 源码分析]一、Abp 框架启动流程分析
- Tomcat6.0源码学习--启动框架
- TOMCAT源码分析(启动框架)
- TOMCAT源码分析(启动框架)
- tomcat启动分析(源码框架)
- Android源码学习之八—系统启动过程
- Android源码学习之六——ActivityManager框架解析
- Android源码学习之六——ActivityManager框架解析
- 开源搜索框架Lucene学习之分词器(4)——通过分词器源码学习装饰者模式
- [ZZ]chrome源码学习之启动流程简介
- Android源码学习之八—系统启动过程
- 开源搜索框架Lucene学习之分词器(3)——通过分词器源码学习抽象方法与虚方法的区别
- 正式学习bootloader,基于u-boot1.1.4(启动流程框架)