首页 > 学院 > 开发设计 > 正文

ABP 框架从源码学习——abp框架启动核心类AbpBootstrapper(2)

2019-11-06 06:11:54
字体:
来源:转载
供稿:网友

在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中

%20public%20interface%20IIocManager%20:%20IIocRegistrar,%20IIocResolver,%20IDisposable%20%20%20%20{%20%20%20%20%20%20%20%20///%20<summary>%20%20%20%20%20%20%20%20%20///%20Reference%20to%20the%20Castle%20Windsor%20Container.%20%20%20%20%20%20%20%20///%20</summary>%20%20%20%20%20%20%20%20IWindsorContainer%20IocContainer%20{%20get;%20}%20%20%20%20%20%20%20%20%20%20///%20<summary>%20%20%20%20%20%20%20///%20Checks%20whether%20given%20type%20is%20registered%20before.%20%20%20%20%20%20%20%20///%20</summary>%20%20%20%20%20%20%20%20%20///%20<param%20name="type">Type%20to%20check</param>%20%20%20%20%20%20%20%20new%20bool%20IsRegistered(Type%20type);%20%20%20%20%20%20%20%20%20///%20<summary>%20%20%20%20%20%20%20%20%20///%20Checks%20whether%20given%20type%20is%20registered%20before.%20%20%20%20%20%20%20%20%20///%20</summary>%20%20%20%20%20%20%20%20%20///%20<typeparam%20name="T">Type%20to%20check</typeparam>%20%20%20%20%20%20%20%20new%20bool%20IsRegistered<T>();%20%20%20%20%20}

其中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方法。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表