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


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

    1  public class MvcApplication : AbpWebApplication
    2     {
    3         protected override void Application_Start(object sender, EventArgs e)
    4         {
    5             AbpBootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(f => f.UseLog4Net().WithConfig("log4net.config"));
    6             base.Application_Start(sender, e);
    7         }
    8     }
    View Code

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

    而在 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();
            }
    View Code

     AbpCoreInstaller的Initialize() 主要执行的就是注册系统框架级的所有配置类,具体代码如下

     1  internal class AbpCoreInstaller : IWindsorInstaller
     2     {
     3         public void Install(IWindsorContainer container, IConfigurationStore store)
     4         {
     5             container.Register(
     6                 Component.For<IUnitOfWorkDefaultOptions, UnitOfWorkDefaultOptions>().ImplementedBy<UnitOfWorkDefaultOptions>().LifestyleSingleton(),
     7                 Component.For<INavigationConfiguration, NavigationConfiguration>().ImplementedBy<NavigationConfiguration>().LifestyleSingleton(),
     8                 Component.For<ILocalizationConfiguration, LocalizationConfiguration>().ImplementedBy<LocalizationConfiguration>().LifestyleSingleton(),
     9                 Component.For<IAuthorizationConfiguration, AuthorizationConfiguration>().ImplementedBy<AuthorizationConfiguration>().LifestyleSingleton(),
    10                  //此处省略若干行
    11 
    12                 );
    13         }
    14     }
    View Code

     3.接着解析AbpStartupConfiguration的实例调用其Initialize()来完成所有配置项的初始设值。 

     4.最后,IAbpModuleManager的实例调用其InitializeModules()初始化所有的Module

     1  public virtual void InitializeModules()
     2         {
     3             LoadAll();
     4 
     5             var sortedModules = _modules.GetSortedModuleListByDependency();
     6 
     7             sortedModules.ForEach(module => module.Instance.PreInitialize());
     8             sortedModules.ForEach(module => module.Instance.Initialize());
     9             sortedModules.ForEach(module => module.Instance.PostInitialize());
    10         }
    View Code

    主意:从上面的代码可以看出,ABP框架初始化每个module时,是先完成所有Module的PreInitialize,然后再执行所有Module的Initialize,最后执行PostInitialize。不是执行完一个Module的这三个方法,再去执行下一个Module的这三个方法。

    另外,AbpModule的基本信息是用AbpModuleInfo封装的,他里面其实也就是将一个abpmodule类封装成Type,Assembly以及模块的依赖模块的AbpModuleInfo等信息。

    5.一旦应用程序结束将在AbpWebApplications中调用AbpBootstrapper的Dispose方法,Dispose通过IAbpModuleManager,执行其ShutdownModules,关闭所有Module。

    1  protected virtual void Application_End(object sender, EventArgs e)
    2         {
    3             AbpBootstrapper.Dispose();
    4         }
    View Code
     public virtual void ShutdownModules()
            {
                var sortedModules = _modules.GetSortedModuleListByDependency();
                sortedModules.Reverse();
                sortedModules.ForEach(sm => sm.Instance.Shutdown());
            }
    View Code
    本人(徐自勉)原创内容,转载请注明出处,作者.
  • 相关阅读:
    angular 写 文字省略显示指令
    REACT 学习之一:普通表单过滤
    怎么能够做到实时的邮件监听-- 求指点
    C++实现Behavioral
    private virtual in c++
    接口污染
    C++ 虚函数&纯虚函数&抽象类&接口&虚基类(转)
    c++ override 关键字
    virtual function c++
    删完垃圾代码2
  • 原文地址:https://www.cnblogs.com/xuzimian/p/5561708.html
Copyright © 2020-2023  润新知