通常来讲,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法。执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成了。 ABP开始的地方就是HttpApplication的构造函数。 以下图一,Abp定义了一个继承自HttpApplication的类AbpApplication。该类的构造函数里会建立AbpBootstrapper实例,而后再Application_Start方法中调用AbpBootstrapper的Initialize方法(稍后解释)。 在Abp的实际web项目中Global.asax中定义的HttpApplication派生类必须继承自AbpWebApplication(以下图二)。html
(图 一)web
(图 二)app
再看AbpBootstrapper的Initialize方法。AbpBootstrapper的Initialize()方法首先给IocManager的IocContainer(也就是IWindsorContainer, ABP使用Castle完成依赖注入) Install AbpCoreInstaller (如图三). AbpCoreInstaller来注册系统框架级的全部配置类,具体代码以下(如图四)。框架
(图 三)函数
除了DefaultModuleFinder其余都是单例的。AbpCoreInstaller注册的是系统框架级(核心框架,也就是指Abp项目)的全部configuration. 很容易理解ABP先完成configuration的依赖注入,由于一个功能所依赖的configuration对象通常都是要在功能被使用前完成初始化。源码分析
(图 四)spa
如下是AbpCoreInstaller代码在ABP源码中的位置。orm
(图 五)htm
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中。