ABP原始碼分析三:ABP Module
Abp是一種基於模組化設計的思想構建的。開發人員可以將自定義的功能以模組(module)的形式整合到ABP中。具體的功能都可以設計成一個單獨的Module。Abp底層框架提供便捷的方法整合每個Module.下圖是所有Abp自帶的module.AbpModule是所有Module的基類,其已經擁有了IIocManager和IAbpStartupConfiguration的受保護的成員,從其派生的Module都可以直接獲取並使用相關的功能(依賴注入,Configuration)。:
以下以AbpWebMvcModule為例,這個就是Abp自定義的一個模組,該模組繼承自AbpModule。 那麼這個模組是怎麼和Abp底層框架整合到一塊的呢?
所謂整合可以從兩個角度開看:
第一,Abp底層框架是如何發現這個Module的?
第二,這個Module是如何把自己的元件(類,介面)註冊到Abp底層框架中(AbpWebMvcModule中,這問題就演變為如何把Controller註冊到Abp底層框架的容器中)?
先分析第二個問題: 如下程式碼中AbpWebMvcModule類中的PreInitialize 和 Initialize 很好的回答了這個問題。在PreInitialize中Abp呼叫IocManager的AddConventionalRegistrar方法以例項化的ControllerConventionalRegistrar為引數。上一篇已介紹過ControllerConventionalRegistrar的用處,這個類的例項在執行RejisterAssembly時會是將繼承至controller的型別都注入到Abp底層框架中(也就是Castle容器中)。 Initialize這注冊了一個Castle的WindsorControllerFactory以替換MVC下預設的ControllerFactory,這樣ASP.NET MVC將使用WindsorControllerFactory從Castle容器中解析出controller.
AddConventionalRegistrar方法向IocManager的一個私有泛型集合List<IConventionalDependencyRegistrar>註冊註冊機制,通常所有的Module類的預初始化方法中呼叫以決定哪些型別需要被註冊(如果沒有就無需呼叫)
現在在看回第一個問題:Abp底層框架是如何發現這個Module的?
解釋這個問題前,有必要解釋一下Module的描述資訊是如何被封裝的。AbpModuleInfo用於封裝AbpModule的基本資訊。 AbpModuleCollection則是AbpModuleInfo的集合。
Abp底層框架發現Module是從AbpBootstrapper
具體關係如下圖。
AbpModuleManager得到所有的AbpModule的AbpModuleInfo以後,逐個呼叫這些Module的PreInitialize,Initialize和PostInitialize以完成初始化。(注意,ABP先完成所有Module的PreInitialize,接著再執行所有Module的Initialize,最後執行PostInitialize。不是執行完一個Module的這三個方法,再去執行下一個Module的這三個方法。這個很好理解,如果是後者的話,我們只要一個Initialize方法就可以了,所有的方法都放入這個Initialize方法中即可。)至此,AbpWebMvcModule算是完成了和Abp底層框架的集成了。值得一提的是所有AbpModule的關閉銷燬也是通過AbpModuleManager呼叫ShutdownModules來遍歷執行AbpModule的Shutdown來實現的。
上面解釋了關於自定義的模組的註冊和初始化,那麼Abp底層框架的一些功能模組的型別的註冊如何實現的呢? 通過AbpKernelModule來實現的,該類會呼叫如下圖中的各種Register完成初始化(攔截器的注入)。以後的文章會逐個解釋這些功能模組。
相關推薦
ABP原始碼分析三:ABP Module
Abp是一種基於模組化設計的思想構建的。開發人員可以將自定義的功能以模組(module)的形式整合到ABP中。具體的功能都可以設計成一個單獨的Module。Abp底層框架提供便捷的方法整合每個Module.下圖是所有Abp自帶的module.AbpModule是所有Module的基類,其已經擁有了IIocMa
ABP原始碼分析五:ABP初始化全過程
ABP在初始化階段做了哪些操作,前面的四篇文章大致描述了一下。 為個更清楚的描述其脈絡,做了張流程圖以輔助說明。其中每一步都涉及很多細節,難以在一張圖中全部表現出來。每一步的細節(會涉及到較多介面,類,呼叫關係,步驟流程什麼的)會在後面的文章中通過其他圖和文字詳細描述。其實如果仔細分析Abp原始碼的話,會發現
ABP原始碼分析二:ABP中配置的註冊和初始化
一般來說,ASP.NET Web應用程式的第一個執行的方法是Global.asax下定義的Start方法。執行這個方法前HttpApplication 例項必須存在,也就是說其建構函式的執行必然是完成了。 ABP開始的地方就是HttpApplication的建構函式。 如下圖一,Abp定義了一個繼承自Http
ABP原始碼分析三十一:ABP.AutoMapper
這個模組封裝了Automapper,使其更易於使用。 下圖描述了改模組涉及的所有類之間的關係。 AutoMapAttribute,AutoMapFromAttribute和AutoMapToAttribute:這三個attribute用於標註一個類到另外一個類的map方向。 Auto
ABP原始碼分析三十四:ABP.Web.Mvc
ABP.Web.Mvc模組主要完成兩個任務: 第一,通過自定義的AbpController抽象基類封裝ABP核心模組中的功能,以便利的方式提供給我們建立controller使用。 第二,一些常見的基礎功能的實現。 AbpController:這是一個抽象基類,繼承自MVC Controller,是A
ABP原始碼分析三十三:ABP.Web
ABP.Web模組並不複雜,主要完成ABP系統的初始化和一些基礎功能的實現。 AbpWebApplication : 繼承自ASP.Net的HttpApplication類,主要完成下面三件事一,在Application_Start完成AbpBootstrapper的初始化。整個ABP系統的初始化就是通過A
ABP原始碼分析三十六:ABP.Web.Api
這裡的內容和ABP 動態webapi沒有關係。除了動態webapi,ABP必然是支援使用傳統的webApi。ABP.Web.Api模組中實現了一些同意的基礎功能,以方便我們建立和使用asp.net webApi。 AbpApiController:這是一個抽象基類,繼承自ApiController,是AB
ABP原始碼分析三十五:ABP中動態WebAPI原理解析
動態WebAPI應該算是ABP中最Magic的功能之一了吧。開發人員無須定義繼承自ApiController的類,只須重用Application Service中的類就可以對外提供WebAPI的功能,這應該算是對DRY的最佳詮釋了. 如下圖所示,一行程式碼就為所有實現了IApplicationService的
ABP原始碼分析三十二:ABP.SignalR
Realtime Realtime是ABP底層模組提供的功能,用於管理線上使用者。它是使用SignalR實現給線上使用者傳送通知的功能的前提 IOnlineClient/OnlineClient: 封裝線上使用者的資訊 OnlineClientManager/IOnlineClientManager:
ABP原始碼分析三十九:ABP.Hangfire
ABP對HangFire的整合主要是通過實現IBackgroundJobManager介面的HangfireBackgroundJobManager類完成的。 HangfireBackgroundJobManager:實現了介面IBackgroundJobManager中的方法EnqueueAsync,通過
ABP原始碼分析三十七:ABP.Web.Api Script Proxy API
ABP提供Script Proxy WebApi為所有的Dynamic WebApi生成訪問這些WebApi的JQuery代理,AngularJs代理以及TypeScriptor代理。這些個代理就是javascript指令碼,通過這些代理可以簡單的訪問Dynamic webApi。 如下例項演示一個最基本的
ABP原始碼分析一:整體專案結構及目錄
ABP是一套非常優秀的web應用程式架構,適合用來搭建集中式架構的web應用程式。 整個Abp的Infrastructure是以Abp這個package為核心模組(core)+15個模組(module).其中13個依賴於Abp這個核心包。另外兩個包(FluentMigration,Web.Resources
ABP原始碼分析十三:快取Cache實現
ABP中有兩種cache的實現方式:MemroyCache 和 RedisCache. 如下圖,兩者都繼承至ICache介面(準確說是CacheBase抽象類)。ABP核心模組封裝了MemroyCache 來實現ABP中的預設快取功能。 Abp.RedisCache這個模組封裝RedisCache來實現快取(
ABP原始碼分析三十八: ABP.Web.Api.OData
如果對OData不熟悉的話可參考OData的初步認識一文以獲取OData的一些初步知識。 API.Odata 模組唯一用處就是提供了一個泛型版本的ODataController,實現了Controller程式碼的常用。 AbpODataEntityController<TEntity, TPrima
ABP原始碼分析八:Logger整合
ABP使用Castle日誌記錄工具,並且可以使用不同的日誌類庫,比如:Log4Net, NLog, Serilog... 等等。對於所有的日誌類庫,Castle提供了一個通用的介面來實現,我們可以很方便的處理各種特殊的日誌庫,而且當業務需要的時候,很容易替換日誌元件。 Logger功能模組涉及到的介面和類不
ABP原始碼分析四:Configuration
核心模組的配置 Configuration是ABP中設計比較巧妙的地方。其通過AbpStartupConfiguration,Castle的依賴注入,Dictionary物件和擴充套件方法很巧妙的實現了配置中心化。配置中心化是一個支援模組開發的框架必備功能。 ABP中核心功能模組中的一些功能的執行時的
ABP原始碼分析六:依賴注入的實現
ABP的依賴注入的實現有一個本質兩個途徑:1.本質上是依賴於Castle這個老牌依賴注入的框架。2.一種實現途徑是通過實現IConventionalDependencyRegistrar的例項定義注入的約定(規則),然後通過IocManager來讀取這個規則完成依賴注入。3另一種實現途徑是直接IocManag
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