文档章节

ABP 框架从源码学习——abp框架启动和结束(1)

徐自勉
 徐自勉
发布于 2017/02/13 17:46
字数 499
阅读 154
收藏 0

   1.abp框架的启动是从Global.asax文件的Application_Start启动的,当然代表Global的application必须从AbpWebApplication继承:

  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方法,Dispose通过IAbpModuleManager,执行其ShutdownModules,关闭所有Module。

 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());
        }

 

© 著作权归作者所有

共有 人打赏支持
徐自勉
粉丝 2
博文 33
码字总数 56058
作品 0
武汉
程序员
私信 提问
ABP架构学习系列一 整体项目结构及目录

本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习。 abp的源码分析学习主要来源于 HK Zhang ,他的博客...

蚊子888
2017/11/30
0
0
ABP架构学习系列二:ABP中配置的注册和初始化

一、手工搭建平台 1.创建项目 创建MVC5项目,手动引入Abp、Abp.Web、Abp.Web.Mvc、Abp.Web.Api 使用nuget添加Newtonsoft.Json、Castle.Core、Castle.Windsor Install-Package Newtonsoft.Jso...

蚊子888
2017/12/01
0
0
[Abp 源码分析]十一、权限验证

0.简介 Abp 本身集成了一套权限验证体系,通过 ASP.NET Core 的过滤器与 Castle 的拦截器进行拦截请求,并进行权限验证。在 Abp 框架内部,权限分为两块,一个是功能(Feature),一个是权限项...

myzony
2018/08/13
0
0
ABP架构学习系列三:手工搭建ABP框架

  由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC、AOP、ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么...

蚊子888
2017/12/04
0
0
[Abp 源码分析]十、异常处理

0.简介 Abp 框架本身针对内部抛出异常进行了统一拦截,并且针对不同的异常也会采取不同的处理策略。在 Abp 当中主要提供了以下几种异常类型: 异常类型 描述 Abp 框架定义的基本异常类型,A...

myzony
2018/08/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(11.9)hive操作基础知识

上一篇博客分享了hive的简介和初体验,本节博主将继续分享一些hive的操作的基础知识。 DDL操作 (1)创建表 #建表语法CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name ...

em_aaron
今天
0
0
OSChina 周四乱弹 —— 我家猫真会后空翻

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听这个# 我艇牛逼,百听不厌,太好听辣 分享 Led Zeppelin 的歌曲《Stairway To Heaven》 《Stairway To Heaven》- Led Z...

小小编辑
今天
1
0
node调用dll

先安装python2.7 安装node-gyp cnpm install node-gyp -g 新建一个Electron-vue项目(案例用Electron-vue) vue init simulatedgreg/electron-vue my-project 安装electron-rebuild cnpm ins......

Chason-洪
今天
3
0
scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
今天
3
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部