ABP的依賴注入的實現有一個本質兩個途徑:1.本質上是依賴於Castle這個老牌依賴注入的框架。2.一種實現途徑是通過實現IConventionalDependencyRegistrar的實例定義注入的約定(規則),然后通過IocManager來讀取這個規則完成依賴注入。3另一種實現途徑是直接IocManager的Register方法直接完成注入。
第一種途徑:
下面具體分析:代碼在Abp項目文件的Dependency文件夾下。
先出一張相關接口和類的關系圖,然后逐個解釋。
IDictionaryBasedConfig/DictionaryBasedConfig: 提供通過Dictionary來管理configuration的功能。經分析,這個Dictionary自始至終都沒被用到過,不清楚Abp作者是怎么想的。
ConventionalRegistrationConfig:封裝了一個bool屬性InstallInstallers,用以告訴Abp底層框架是否要register相應assembly中的通過IWindsorInstaller接口指定的register規則。(具體參考Castle關於通過IWindsorInstaller進行register的知識)
IConventionalRegistrationContext/ConventionalRegistrationContext: 和其他上下文類起的作用類似。主要就是作為方法參數方便方法間的傳遞數據。這里主要封裝了Assembly,IocManager和ConventionalRegistrationConfig。
IConventionalDependencyRegistrar:IocManager封裝了一個IConventionalDependencyRegistrar的list. IocManager在RegisterAssemblyByConvention方法中遍歷這個list,並根據IConventionalDependencyRegistrar的實例中定義的規則來完成register。注:IocManager的RegisterAssemblyByConvention是在AbpKernelModule的Initialize方法中被調用的。
下面按順序貼一下代碼:
首先AbpKernelModule在PreInitialize方法中給IocManager的IConventionalDependencyRegistrar的list中加入BasicConventionalRegistrar(后面有解釋)
IocManager維護了一個叫_conventionalRegistrars的list,其中的元素類型就是IConventionalDependencyRegistrar。
接着IocManager的RegisterAssemblyByConvention是在AbpKernelModule的Initialize方法中被調用
IocManager在RegisterAssemblyByConvention方法中遍歷這個list,並根據IConventionalDependencyRegistrar的實例中定義的規則來完成register。
IConventionalDependencyRegistrar的四個實現類在前面文章有講過,這邊不在重復了。貼下BasicConventionalRegistrar的代碼,其注冊所有繼承至ITransientDependency,ISingletonDependency和IInterceptor接口的類。
到這里,基本講清楚了通過IConventionalDependencyRegistrar進行依賴注入的過程。
第二種途徑:
直接上代碼解釋,AbpModule有個受保護的IocManager的成員,所以AbpModule的派生類都可以使用這個IocManager完成注冊。
最后推薦Abp中一個比較有意思的單例模式的實現:
SingletonDependency: 為容器中的實例生成Singelton實例的方法(不做解釋)。這是一個線程安全並且實現了延時加載的單例模式。充分利用了.Net 4.0的新語法Lazy.