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 }
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() 主要執行的就是注冊系統框架級的所有配置類,具體代碼如下
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 }
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 }
主意:從上面的代碼可以看出,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 }
public virtual void ShutdownModules() { var sortedModules = _modules.GetSortedModuleListByDependency(); sortedModules.Reverse(); sortedModules.ForEach(sm => sm.Instance.Shutdown()); }
