【转】ABP源码分析六:依赖注入的实现
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.
?
返回ABP源碼分析系列文章目錄
?
Q:有幾點問題想請教,
初始化只是在Castle里注冊了各個模塊,
但實例是在運行時才注入的,并且ABP可以逐層注入所需的依賴,這一點是Castle的IOC自帶的特性還是ABP的實現?
另外注入的起點是從哪里開始呢?Controler嗎?
A:ABP是靠Castle實現依賴注入的,ABP本身是沒有實現依賴注入的功能的。注入的起點是指什么?ABP各個模塊都是在PreInitialize或Initialize方法中配置注入
E:我剛才找到答案了,我的意思是指在bootstraper中,完成了初始化注冊后
調用了
?
| 1 | _moduleManager = IocManager.Resolve<IAbpModuleManager>(); |
那么AbpModuleManager中所有的依賴(無論是通過構造器注入或者屬性注入)都會被注入,比如其中的IIocManager和IModuleFinder都被注入,然后調用各個模塊注冊控件。
那么起點就是第一個調用Resolve地方,我就是在找這個。
因為每一層都是Castle自動注入的,但總要有一個開端來Resolve吧,剛才就是在好奇這個。
不過Castle也太強大了,同時支持屬性注入和構造器注入,并且逐層注入,其他的IOC框架似乎都沒有這么智能。
總結
以上是生活随笔為你收集整理的【转】ABP源码分析六:依赖注入的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以卡办卡多久下卡?以卡办卡常见问题及分析
- 下一篇: 只有一万怎么理财?小额理财方法!