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原始碼分析六:依賴注入的實現
ABP的依賴注入的實現有一個本質兩個途徑:1.本質上是依賴於Castle這個老牌依賴注入的框架。2.一種實現途徑是通過實現IConventionalDependencyRegistrar的例項定義注入的約定(規則),然後通過IocManager來讀取這個規則完成依賴注入。3另一種實現途徑是直接IocManag
ABP原始碼分析十三:快取Cache實現
ABP中有兩種cache的實現方式:MemroyCache 和 RedisCache. 如下圖,兩者都繼承至ICache介面(準確說是CacheBase抽象類)。ABP核心模組封裝了MemroyCache 來實現ABP中的預設快取功能。 Abp.RedisCache這個模組封裝RedisCache來實現快取(
Spring Security原始碼分析四:Spring Social實現微信社交登入
社交登入又稱作社會化登入(Social Login),是指網站的使用者可以使用騰訊QQ、人人網、開心網、新浪微博、搜狐微博、騰訊微博、淘寶、豆瓣、MSN、Google等社會化媒體賬號登入該網站。 前言 在上一章Spring-Security原始碼分析
Spring Security原始碼分析三:Spring Social實現QQ社交登入
社交登入又稱作社會化登入(Social Login),是指網站的使用者可以使用騰訊QQ、人人網、開心網、新浪微博、搜狐微博、騰訊微博、淘寶、豆瓣、MSN、Google等社會化媒體賬號登入該網站。 OAuth2.0的認證流程示意圖 請求第三方應用
ABP原始碼分析三:ABP Module
Abp是一種基於模組化設計的思想構建的。開發人員可以將自定義的功能以模組(module)的形式整合到ABP中。具體的功能都可以設計成一個單獨的Module。Abp底層框架提供便捷的方法整合每個Module.下圖是所有Abp自帶的module.AbpModule是所有Module的基類,其已經擁有了IIocMa
ABP原始碼分析一:整體專案結構及目錄
ABP是一套非常優秀的web應用程式架構,適合用來搭建集中式架構的web應用程式。 整個Abp的Infrastructure是以Abp這個package為核心模組(core)+15個模組(module).其中13個依賴於Abp這個核心包。另外兩個包(FluentMigration,Web.Resources
ABP原始碼分析五:ABP初始化全過程
ABP在初始化階段做了哪些操作,前面的四篇文章大致描述了一下。 為個更清楚的描述其脈絡,做了張流程圖以輔助說明。其中每一步都涉及很多細節,難以在一張圖中全部表現出來。每一步的細節(會涉及到較多介面,類,呼叫關係,步驟流程什麼的)會在後面的文章中通過其他圖和文字詳細描述。其實如果仔細分析Abp原始碼的話,會發現
ABP原始碼分析八:Logger整合
ABP使用Castle日誌記錄工具,並且可以使用不同的日誌類庫,比如:Log4Net, NLog, Serilog... 等等。對於所有的日誌類庫,Castle提供了一個通用的介面來實現,我們可以很方便的處理各種特殊的日誌庫,而且當業務需要的時候,很容易替換日誌元件。 Logger功能模組涉及到的介面和類不
ABP原始碼分析四:Configuration
核心模組的配置 Configuration是ABP中設計比較巧妙的地方。其通過AbpStartupConfiguration,Castle的依賴注入,Dictionary物件和擴充套件方法很巧妙的實現了配置中心化。配置中心化是一個支援模組開發的框架必備功能。 ABP中核心功能模組中的一些功能的執行時的
ABP原始碼分析二:ABP中配置的註冊和初始化
一般來說,ASP.NET Web應用程式的第一個執行的方法是Global.asax下定義的Start方法。執行這個方法前HttpApplication 例項必須存在,也就是說其建構函式的執行必然是完成了。 ABP開始的地方就是HttpApplication的建構函式。 如下圖一,Abp定義了一個繼承自Http
ABP原始碼分析七:Setting 以及 Mail
本文主要說明Setting的實現以及Mail這個功能模組如何使用Setting. 首先區分一下ABP中的Setting和Configuration。 Setting一般用於需要通過外部配置檔案(或資料庫)設定的簡單型別資料(一般就是字串),比如SMTP HOST. Configuration一般
ABP原始碼分析十:Unit Of Work
ABP以AOP的方式實現UnitOfWork功能。通過UnitOfWorkRegistrar將UnitOfWorkInterceptor在某個類被註冊到IOCContainner的時候,一併新增到該類在容器中對應的ComponentModel的Interceptors集合中。總結一句話就是,UOW的功能是通過
ABP原始碼分析九:後臺工作任務
文主要說明ABP中後臺工作者模組(BackgroundWorker)的實現方式,和後臺工作模組(BackgroundJob)。ABP通過BackgroundWorkerManager來管理BackgroundJobManager,然後通過BackgroundJobManager來管理BackgroundJob
Tomcat原始碼分析之:ServletOutputStream的實現
貌似很久都沒有寫部落格了,tomcat8的程式碼已經看了很多,主體部分的程式碼也都看得差不多了,發現在tomcat8中已經完全支援非阻塞的方式接收以及傳送資料了。。。。但是比較遺憾的是,以前遺留下來的太多的老程式碼都不支援這種新的方式來發送資料。。。木有辦法。。。 這裡來看
Spring Security原始碼分析六:Spring Social社交登入原始碼解析
在Spring Security原始碼分析三:Spring Social實現QQ社交登入和Spring Security原始碼分析四:Spring Social實現微信社交登入這兩章中,我們使用Spring Social已經實現了國內最常用的QQ和微信社交
Flask原始碼分析二:路由內部實現原理
前言 Flask是目前為止我最喜歡的一個Python Web框架了,為了更好的掌握其內部實現機制,這兩天準備學習下Flask的原始碼,將由淺入深跟大家分享下,其中Flask版本為1.1.1。 上次瞭解了Flask服務的啟動流程,今天我們來看下路由的內部實現機理。 Flask系列文章: Flask開發初探 F
ABP原始碼分析二十六:核心框架中的一些其他功能
本文是ABP核心專案原始碼分析的最後一篇,介紹一些前面遺漏的功能 AbpSession AbpSession: 目前這個和CLR的Session沒有什麼直接的聯絡。當然可以自定義的去實現IAbpSession使之與CLR的Session關聯 IAbpSession:定義如下圖中的四個屬性。 NullA
ABP原始碼分析十六:DTO的設計
IDTO:空介面,用於標註Dto物件。 ComboboxItemDto:用於combobox/list中Item的DTO NameValueDto<T>/NameValueDto:用於name value鍵值對的DTO, name為string型別, value為泛型或string型別。
ABP原始碼分析十七:DTO 自動校驗的實現
對傳給Application service物件中的方法的DTO引數,ABP都會在方法真正執行前自動完成validation(根據標註到DTO物件中的validate規則)。 ABP是如何做到的? 思路無外乎通過Castle的攔截器實現AOP。本文主要分析ABP是如何設計。 Ivalidate: 空介面,用
ABP原始碼分析三十六:ABP.Web.Api
這裡的內容和ABP 動態webapi沒有關係。除了動態webapi,ABP必然是支援使用傳統的webApi。ABP.Web.Api模組中實現了一些同意的基礎功能,以方便我們建立和使用asp.net webApi。 AbpApiController:這是一個抽象基類,繼承自ApiController,是AB