【转】ABP源码分析三:ABP Module
Abp是基于模塊化設(shè)計(jì)思想進(jìn)行構(gòu)建的。開發(fā)人員可以將自定義的功能以模塊(module)的形式集成到ABP中。具體的功能都可以設(shè)計(jì)成一個(gè)單獨(dú)的Module。Abp底層框架提供便捷的方法集成每個(gè)Module.下圖是所有Abp自帶的module.AbpModule是所有Module的基類,其已經(jīng)擁有了IIocManager和IAbpStartupConfiguration的受保護(hù)的成員,從其派生的Module都可以直接獲取并使用相關(guān)的功能(依賴注入,Configuration)。:
?
以下以AbpWebMvcModule為例,這個(gè)就是Abp自定義的一個(gè)模塊,該模塊繼承自AbpModule。 那么這個(gè)模塊是怎么和Abp底層框架集成到一塊的呢?
所謂集成可以從兩個(gè)角度開看:
第一,Abp底層框架是如何發(fā)現(xiàn)這個(gè)Module的?
第二,這個(gè)Module是如何把自己的組件(類,接口)注冊(cè)到Abp底層框架中(AbpWebMvcModule中,這問題就演變?yōu)?#xff1a;如何把Controller注冊(cè)到Abp底層框架的容器中)?
先分析第二個(gè)問題: 如下代碼中AbpWebMvcModule類中的PreInitialize 和 Initialize 很好的回答了這個(gè)問題。在PreInitialize中Abp調(diào)用IocManager的AddConventionalRegistrar方法,以實(shí)例化的ControllerConventionalRegistrar為參數(shù)。上一篇已介紹過ControllerConventionalRegistrar的用處,這個(gè)類的實(shí)例在執(zhí)行RejisterAssembly時(shí),會(huì)將繼承自controller的類型都注入到Abp底層框架中(也就是Castle容器中)。 Initialize這注冊(cè)了一個(gè)Castle的WindsorControllerFactory以替換MVC下默認(rèn)的ControllerFactory,這樣ASP.NET MVC將使用WindsorControllerFactory從Castle容器中解析出controller.
AddConventionalRegistrar方法向IocManager的一個(gè)私有泛型集合List<IConventionalDependencyRegistrar>注冊(cè)注冊(cè)機(jī)制,通常所有的Module類的預(yù)初始化方法中調(diào)用以決定哪些類型需要被注冊(cè)(如果沒有就無需調(diào)用)
?
現(xiàn)在在看回第一個(gè)問題:Abp底層框架是如何發(fā)現(xiàn)這個(gè)Module的?
解釋這個(gè)問題前,有必要解釋一下Module的描述信息是如何被封裝的。AbpModuleInfo用于封裝AbpModule的基本信息。?AbpModuleCollection則是AbpModuleInfo的集合。
?
Abp底層框架發(fā)現(xiàn)Module是從AbpBootstrapper在執(zhí)行Initialize方法的時(shí)候開始的,該方法會(huì)調(diào)用IAbpModuleManager實(shí)例的InitializeModules方法,這個(gè)方法接著調(diào)用DefaultModuleFinder的FindAll方法(該方法用于過濾出AbpModule的assembly),而FindAll方法調(diào)用TypeFinder得到所有的assembly. 所以只要你定義的assembly中有一個(gè)繼承至AbpModule的類,并且該assembly被引用到你的項(xiàng)目中,那么這個(gè)Module就可以說會(huì)被Abp底層框架集成了。
具體關(guān)系如下圖。
?
AbpModuleManager得到所有的AbpModule的AbpModuleInfo以后,逐個(gè)調(diào)用這些Module的PreInitialize,Initialize和PostInitialize以完成初始化。(注意,ABP先完成所有Module的PreInitialize,接著再執(zhí)行所有Module的Initialize,最后執(zhí)行PostInitialize。不是執(zhí)行完一個(gè)Module的這三個(gè)方法,再去執(zhí)行下一個(gè)Module的這三個(gè)方法。這個(gè)很好理解,如果是后者的話,我們只要一個(gè)Initialize方法就可以了,所有的方法都放入這個(gè)Initialize方法中即可。)至此,AbpWebMvcModule算是完成了和Abp底層框架的集成了。值得一提的是所有AbpModule的關(guān)閉銷毀也是通過AbpModuleManager調(diào)用ShutdownModules來遍歷執(zhí)行AbpModule的Shutdown來實(shí)現(xiàn)的。
?
上面解釋了關(guān)于自定義的模塊的注冊(cè)和初始化,那么Abp底層框架的一些功能模塊的類型的注冊(cè)如何實(shí)現(xiàn)的呢? 通過AbpKernelModule來實(shí)現(xiàn)的,該類會(huì)調(diào)用如下圖中的各種Register完成初始化(攔截器的注入)。以后的文章會(huì)逐個(gè)解釋這些功能模塊。
?
?
?
返回ABP源碼分析系列文章目錄
?
博主你好,可以麻煩指點(diǎn)一下你這個(gè)代碼圖怎么生成的嗎
vs2017安裝一個(gè)組件,你安裝2017的時(shí)候,找找,有個(gè)玩意叫做“體系結(jié)構(gòu)和分析工具”。一般人還不告訴他。
不知道樓主當(dāng)時(shí)用的是什么版本,現(xiàn)在的版本更新了很多子模塊了。
總結(jié)
以上是生活随笔為你收集整理的【转】ABP源码分析三:ABP Module的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】ABP源码分析四十二:ZERO的身
- 下一篇: 【转】刨根究底字符编码之十五——UTF-