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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM