一開始可能會寫得很亂,因為自己也不太清楚從哪裡入手,可能會直接將一些別人的心得羅列出來,後面我會在吸收了以後,找到了頭緒,然後整理歸納出自己的東西。 不多扯了,先摘一段別人的心得,原文鏈接http://www.cnblogs.com/Azula/p/4988949.html 一 . AbpBoots ...
一開始可能會寫得很亂,因為自己也不太清楚從哪裡入手,可能會直接將一些別人的心得羅列出來,後面我會在吸收了以後,找到了頭緒,然後整理歸納出自己的東西。
不多扯了,先摘一段別人的心得,原文鏈接http://www.cnblogs.com/Azula/p/4988949.html
一 . AbpBootstrapper類在Abp.dll中,其主要用於框架的基本配置的註冊和初始化,在Web應用啟動階段實例化一個AbpBootstrapper並調用Initialize方法初始化,
public abstract class AbpWebApplication : HttpApplication { /// <summary> /// Gets a reference to the <see cref="AbpBootstrapper"/> instance. /// </summary> protected AbpBootstrapper AbpBootstrapper { get; private set; } protected AbpWebApplication() { AbpBootstrapper = new AbpBootstrapper(); } /// <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()方法時首先會執行
public virtual void Initialize() { IocManager.IocContainer.Install(new AbpCoreInstaller()); IocManager.Resolve<AbpStartupConfiguration>().Initialize(); _moduleManager = IocManager.Resolve<IAbpModuleManager>(); _moduleManager.InitializeModules(); }
AbpBootstrapper的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(),
//此處省略若幹行
); } }
接著解析AbpStartupConfiguration的實例調用其Initialize()來完成所有配置項的初始設值。
解析IAbpModuleManager的實例調用其InitializeModules()初始化所有的Module
一旦應用程式結束將在AbpWebApplications中調用
protected virtual void Application_End(object sender, EventArgs e) { AbpBootstrapper.Dispose(); }
AbpBootstrapper的Dispose方法中析構IAbpModuleManager,執行其ShutdownModules,關閉所有Module。
二.下麵看一下AbpBootstrapper中的兩個至關重要的屬性:IIocManager 和 IAbpModuleManager
public class AbpBootstrapper : IDisposable { /// <summary> /// Gets IIocManager object used by this class. /// </summary> public IIocManager IocManager { get; private set; } /// <summary> /// Is this object disposed before? /// </summary> protected bool IsDisposed; private IAbpModuleManager _moduleManager;
//.........
}
IIocManager內部包裝了一個Castle的依賴註入容器IWindsorContainer(abp使用的是Castle windor框架,在此框架的基礎上做了一些封裝),
所有類型的註冊,解析還有後面實現的AOP機制的攔截器都是註冊在該容器中的,將具體的註冊還有解析功能分別包含在其父介面IIocRegistrar和IIocResolver中,
public interface IIocManager : IIocRegistrar, IIocResolver, IDisposable { /// <summary> /// Reference to the Castle Windsor Container. /// </summary> IWindsorContainer IocContainer { get; } /// <summary> /// Checks whether given type is registered before. /// </summary> /// <param name="type">Type to check</param> new bool IsRegistered(Type type); /// <summary> /// Checks whether given type is registered before. /// </summary> /// <typeparam name="T">Type to check</typeparam> new bool IsRegistered<T>(); }
其中IIocRegistrar類的
1.AddConventionalRegistrar,
2.RegisterAssemblyByConvention(Assembly assembly),
3.RegisterAssemblyByConvention(Assembly assembly, ConventionalRegistrationConfig config) 三個方法需要特別註意:
第一個方法,AddConventionalRegistrar是向IocManager的一個私有泛型集合List<IConventionalDependencyRegistrar>註冊註冊機制,這句話不太好明白,簡單說就是設定依賴註入模塊的註入方式,
通常所有的Module類的預初始化方法中調用以決定哪些類型需要被註冊(如果沒有就無需調用),
比如在Abp程式集中的BasicConventionalRegistrar實現的就是搜索並註冊指定的程式集中的所有實現了ITransientDependency,ISingletonDependency和IInterceptor的類並註冊到依賴容器中,
第二,第三個方法執行真正的註冊邏輯,
通常在一個個具體的Module的初始化方法中調用,傳入當前Module所屬的程式集,
迭代List<IConventionalDependencyRegistrar>將當前程式集作為參數執行註冊,
第二,第三個方法的區別在於第三個方法多了一個ConventionalRegistrationConfig參數,以決定是否還需要搜索當前程式及中的IWindsorInstaller的實現類進行註冊,預設是需要的。
IAbpModuleManager主要用於管理所有的模塊預設也就是一個個的程式集(一個模塊對應一個程式集),主要用於搜索到所有的Module以及他們的依賴Module,首先執行所有Module的PreInitialize方法再執行所有的Initialize,最後執行所有的PostInitialize,執行IAbpModuleManager的ShutdownModules時順序顛倒依次執行所有具體Module的ShutDown方法。