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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】ABP源码分析三:ABP Module

發(fā)布時(shí)間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】ABP源码分析三:ABP Module 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。