日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】ABP源码分析六:依赖注入的实现

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】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源码分析六:依赖注入的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。