一开始可能会写得很乱,因为自己也不太清楚从哪里入手,可能会直接将一些别人的心得罗列出来,后面我会在吸收了以后,找到了头绪,然后整理归纳出自己的东西。
不多扯了,先摘一段别人的心得,原文链接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方法。
原标题:ABP 框架从源码学习1
关键词: