ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法。执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成了。 ABP开始的地方就是HttpApplication的构造函数。 如下图一,Abp定义了一个继承自HttpApplication的类AbpApplication。该类的构造函数里会创建AbpBootstrapper实例,然后再Application_Start方法中调用AbpBootstrapper的Initialize方法(稍后解释)。 在Abp的实际web项目中Global.asax中定义的HttpApplication派生类必须继承自AbpWebApplication(如下图二)。
(图 一)
(图 二)
再看AbpBootstrapper的Initialize方法。AbpBootstrapper的Initialize()方法首先给IocManager的IocContainer(也就是IWindsorContainer, ABP使用Castle完成依赖注入) Install AbpCoreInstaller (如图三). AbpCoreInstaller来注册系统框架级的所有配置类,具体代码如下(如图四)。
(图 三)
除了DefaultModuleFinder其他都是单例的。AbpCoreInstaller注册的是系统框架级(核心框架,也就是指Abp项目)的所有configuration. 很容易理解ABP先完成configuration的依赖注入,因为一个功能所依赖的configuration对象一般都是要在功能被使用前完成初始化。
(图 四)
以下是AbpCoreInstaller代码在ABP源码中的位置。
(图 五)
IocManager的IocContainer就是IWindsorContainer, ABP使用Castle完成依赖注入。
AbpBootstrapper类持有IocManager实例
AbpCoreInstaller只是完成注册系统框架级的所有配置类。Abp支持自动完成符合Conventional(基于约定)的组件的注册。 Conventional 的规则要通过继承IConventionalDependencyRegistrar接口实现。
如下图,ABP中继承自IConventionalDependencyRegistrar接口的四个类。 其中BasicConventionalRegistrar设置了所有继承至ITransientDependency,ISingletonDependency和IInterceptor接口的类都会被自动注册。
其他三个则分别注册AbpDbContext,ApiController和Controller的派生类。
BasicConventionalRegistrar的代码,其注册所有继承至ITransientDependency,ISingletonDependency和IInterceptor接口的类。
IIocManager是处理依赖注入的核心接口,他将具体的注册还有解析功能分别包含在其父接口IIocRegistrar和IIocResolver中。