ABP詳細教程——模塊類

概述

73c6c649d58b67ccfd5d23ab157c79eb.png

模塊化是ABP vNext的最大亮點,也是ABP vNext框架的核心,而模塊類是ABP vNext框架模塊化的核心要素。

33a1fff1fd2d059a366d604be1e136d8.png

這一章節,我就從模塊類的用法、運行機制、源代碼等層面,帶大家詳細了解ABP vNext的模塊類。

用法

00f93be68e8d8ce9c908dda2dee30963.gif

在ABP的約定中,每個項目(類庫)都應該包含一個繼承自?AbpModule?的模塊類,命名規范為【項目名稱+Module】

a497ca95f43585e88e177c83402e1596.gif

在模塊類中,我們可以重寫?AbpModule?中的服務配置和應用初始化、服務關閉時的處理方法。

67429f382a91e8301e7fe55c486745e5.gif

ConfigureServices?方法用于在應用正式啟動前對應用的服務的參數與依賴注入項進行配置。

888379f8ad6e791d07aae536ce89be2c.gif

在?ConfigureServices?方法中,我們可以使用?context.Services?中的方法對以來注入進行定義或修改,也可以使用??Configure<...>();?方法對服務中的指定配置項進行配合。例如:

public override void ConfigureServices(ServiceConfigurationContext context)
{//自定義依賴注入context.Services.AddTransient<IUserRepository,UserRepostory>();//自定義配置Configure<AbpClockOptions>(options =>{options.Kind = DateTimeKind.Local;});
}

084510720fd6475cd96b5a9dbc72357f.gif

同時,ABP也提供了異步的服務配置方法?ConfigureServicesAsync?,其用法與?ConfigureServices?相同。

9b1d019b6f31cc6436738579c03dc604.gif

另外,ABP還提供了?PreConfigureServices?和?PostConfigureServices?方法,分別在執行?ConfigureServices?前和執行后編寫自己的邏輯處理,對應的,也提供異步方法?PreConfigureServicesAsync?和?PostConfigureServicesAsync?。

14d1916371a008c3dcf0adcfd1de888b.gif

OnApplicationInitialization?方法在應用初始化時被執行,最常見的用途是配置管道模型,同時,也可以添加一些額外的處理,例如添加后臺作業、完成服務注冊等。

1d40739d178da1b44dcbf1c8498b1a9d.gif

同時,ABP也提供了異步的服務初始化方法?OnApplicationInitializationAsync?,和在其前后的處理?OnPreApplicationInitialization?和?OnPostApplicationInitialization?

708c0885f0421e82907e9a119f4d23f5.gif

OnApplicationShutdown?方法和其異步方法?OnApplicationShutdownAsync?在程序關閉時被執行,可用于釋放資源等操作。

b5316a8772959858935700add2257492.gif

當一個項目依賴另一個項目時,除需要引用該項目外,當前項目的模塊類需要通過DependOn特性添加對被引用項目的模塊類的使用,用法如下:

[DependsOn(typeof(AbpDemoDomainModule),typeof(AbpDemoApplicationContractsModule),... ...)]
public class AbpDemoApplicationModule : AbpModule
{}

運行機制

1260e760bb6be877fd4a699a68610980.gif

ABP框架項目啟動時,會從啟動項的模塊類開始,按照模塊類中編寫的DependOn特性關系及順序查找所有依賴模塊類,并形成一個屬性結構,按樹形結構后序遍歷算法遞歸遍歷樹形成一個模塊類的列表,遞歸過程中如果已經加載過的模塊類則被忽略。先在列表中遍歷執行所有模塊類的PreConfigureServices?,然后遍歷執行所有模塊類的?ConfigureServices?,之后同樣方式執行:?PostConfigureServicesAsync?、?OnPreApplicationInitialization?、?OnApplicationInitialization?、?OnPostApplicationInitialization?。

d31cc22060271ffcd5b4cbadc31ebeeb.png

后序遍歷算法時先從左到右處理所有子節點,再處理子根節點的遍歷算法。

876f525f2cb59725c43fb8a22c262eb4.gif

例如在ABP默認到處的框架中,依賴關系如下圖所示,其中HttpApiHost為啟動項(Web項目結構相同)。圖中圓圈標記的序號順序是后續遍歷算法中遍歷的順序,其中藍色圓圈表示未添加過該模塊類,遍歷時添加到模塊類列表,紅色圓圈表示已添加過,在遍歷時不添加。

e1c3eccaf72f942e89ff77f95cee65d0.png

依據圖中大家可以看出,該項目模塊類列表順序為:DomainSharedModule → ApplicationContractsModule → HttpApiModule →?DomainModule?→?ApplicationModule?→?EntityFrameworkCoreModule?→?HttpApiHostModule

也就意味著,執行順序為:DomainSharedModule.PreConfigureServices → ApplicationContractsModule.PreConfigureServices → ... ... →?HttpApiHostModule.PreConfigureServices →?DomainSharedModule.ConfigureServices →?ApplicationContractsModule.ConfigureServices → ... ...?→?HttpApiHostModule.ConfigureServices → ... ...?→?HttpApiHostModule.OnPostApplicationInitialization

核心源碼導讀

46cfd7ceb693c582ecd74ef471a1d7fe.gif

ABP模塊化的所有代碼都存放于ABP源碼的Volo.Abp.Core項目下Volo/Abp/Modularity文件夾下:https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.Core/Volo/Abp/Modularity

39b0eeba301f6ef431f38e60277f9f2e.gif

AbpModule?為模塊類的基類,在該類中我們可以看到PreConfigureServices、ConfigureServices等方法的虛方法,和PreConfigureServicesAsync、ConfigureServicesAsync等異步的虛方法。我們可以看到這些方法中沒有任何實際代碼,異步方法中也只是添加了對相應的同步方法的調用。在實際項目的模塊類中,我們可以依據需求重寫這些方法。

4a917adfb67312c2730f7a598907f149.gif

AbpModuleDescriptor?是用來存儲模塊類信息及其依賴關系的類,其中?IReadOnlyList<IAbpModuleDescriptor> Dependencies?屬性用于存儲當前模塊的依賴模塊,以此形成樹形結構。

30027969dc57f104a37e22dc5038682a.gif

DependsOnAttribute?是用于標記依賴關系的特性,而查找依賴關系時,是通過其繼承的?IDependedTypesProvider?接口,如果需要,我們也可以通過實現此接口自定義依賴關系特性。

467348327dfdec6ff3564e40027fdec0.gif

IModuleLoader?接口聲明了加載模塊列表的方法定義,其官方提供的實現類為?ModuleLoader?,源碼中實現代碼如下:

28f11b888da6e1a5c34346d7c64f7845.png

通過該方法,實現了章節3中提到的模塊類執行順序的構建。

4ff2b437627646f15b9dd68df793949c.gif

IModuleLifecycleContributor?是模塊生命周期提供者接口,在DefaultModuleLifecycleContributor.cs文件中提供了多個該接口的實現類,分別對應應用初始化前、初始化、初始化后和應用關閉事件。

f6bd9ad44472ddb8d0187647b6cd9eaf.png

在Volo/Abp/Modularity下其他類或接口主要是對以上幾個核心類的封裝或者提供細節實現,這里不進行一一列舉。

f925dfcb122b5e20b010528b06861456.png

END

6f09057d5dc6d1aca31be2a753d39441.jpeg

3e3b9587f489d0fe31f967664cdbeaf1.png

關注我獲得

更多精彩

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284000.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284000.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284000.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]Eureka工作原理

目錄 Eureka 工作原理 Eureka 核心概念 自我保護機制 Eureka 集群原理 Eurka 工作流程 總結 Eureka 工作原理 上節內容為大家介紹了&#xff0c;注冊中心 Eureka 產品的使用&#xff0c;以及如何利用 Eureka 搭建單臺和集群的注冊中心。這節課我們來繼續學習 Eureka&…

centos7下別名(alias)的特殊用法

版權聲明&#xff1a;轉載請注明出處:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/79438200 參考&#xff1a;https://www.cyberciti.biz/faq/bash-bypass-alias-command-on-linux-macos-unix/ 正常情況下&#xff0c;定義過的別名&a…

解決WDCP3環境gbk網站編碼程序亂碼問題

因為默認WDCP V3版本環境編碼格式是UTF-8版本&#xff0c;如果我們程序采用的是GBK編碼肯定都會有亂碼問題。 我們到WDCP后臺&#xff0c;"網站管理"-"PHP設置"&#xff0c;看到上圖所示&#xff0c;準備直接在線編輯PHP.INI文件。 這里我們找到"defa…

重談聯想5G編碼投票事件

此前&#xff0c;司馬南談了聯想好幾個問題&#xff0c;其中最尖銳的要屬國有資產流失&#xff0c;這是聯想管理層無法回避的死穴。不過&#xff0c;司馬南批判聯想5G投票背刺H公司&#xff0c;這基本就是造謠了。當年&#xff0c;媒體把編碼投票炒作的很厲害&#xff0c;抨擊聯…

JStorm2.1.1集群的安裝和使用

為什么80%的碼農都做不了架構師&#xff1f;>>> JStorm2.1.1集群的安裝和使用 Storm是一個免費開源、分布式、高容錯的實時計算系統&#xff0c;而JStorm是阿里巴巴開源的基于Storm采用Java重寫的一套分布式實時流計算框架&#xff0c;在性能和支持的集群規模上做了…

Hystrix 原理

Hystrix是什么&#xff1f; Hystrix是Netflix開源庫&#xff0c;這是一個針對分布式系統的延遲和容錯庫。 Hystrix 供分布式系統使用&#xff0c;提供延遲和容錯功能&#xff0c;隔離遠程系統、訪問和第三方程序庫的訪問點&#xff0c;防止級聯失敗&#xff0c;保證復雜的分布…

「深度」無人機實名制政策特稿|市場看好、資本關注,“反黑飛”正在崛起

從政策和需求來看&#xff0c;“反黑飛”越來越重要&#xff0c;市場也正在不斷崛起。 對于大多數人來說&#xff0c;今天是最適合明目張膽“裝嫩”的六一兒童節。不過&#xff0c;在無人機廠商和無人機玩家的眼里&#xff0c;今天是無人機實名制政策正式實施的日子。 近年來&…

在navicat中新建數據庫

前言&#xff1a; 在本地新建一個名為editor的數據庫&#xff1b; 過程&#xff1a; 1.&#xff1b; 2.選擇&#xff1a;utf8mb4 -- UTF-8 Unicode字符集&#xff0c;原因在于&#xff1a;utf8mb4兼容utf8&#xff0c;且比utf8能表示更多的字符。&#xff0c;而且它支持表情符號…

MASA Stack 第三期社區例會

MASA Blazor 0.5.0發版內容功能Autocomplete&#xff1a;支持通過設置AutoSelectFirst參數開啟自動選擇第一項的功能&#xff0c;支持CacheItems參數&#xff0c;增強使用上下鍵的用戶體驗。BottomNavigation&#xff1a;&#xff1a;一個替代側邊欄的新組件。它主要用于移動應…

MySQL添加用戶、刪除用戶與授權

MySql中添加用戶,新建數據庫,用戶授權,刪除用戶,修改密碼(注意每行后邊都跟個;表示一個命令語句結束): 1.新建用戶 1.1 登錄MYSQL&#xff1a; >mysql -u root -p >密碼 1.2 創建用戶&#xff1a; mysql> insert into mysql.user(Host,User,Password) values("lo…

[轉]高并發架構設計之--「服務降級」、「服務限流」與「服務熔斷」

目錄 服務降級 1 、簡介 2 、使用場景 3 、核心設計 3.1 分布式開關 3.2 自動降級分類 3.3 配置中心 3.4 處理策略 3.5 降級分類 3.6 服務降級要考慮的問題 4 、高級特性 4.1 分級降級 4.2 降級權值 5 、總結與展望 服務限流 一、為什么要做服務限流設計&…

【Linux】【Services】【nfs】nfs安裝與配置

1. 概念 1.1. NFS&#xff1a;Network File System&#xff0c;傳統意義上&#xff0c;文件系統在內核中實現。 1.2. RPC&#xff1a;Remote Procedure Call protocol&#xff0c;遠程過程調用&#xff0c;函數調用&#xff08;遠程主機上的函數&#xff09; 1.3. 端口&#xf…

SpringBoot獲取ApplicationContext

2019獨角獸企業重金招聘Python工程師標準>>> 有兩種方法&#xff1a; 創建Component實現ApplicationContextAware接口&#xff0c;SpringBoot會自動調用這個類的setApplicationConext()方法。鼓勵使用這種方式。SpringApplication.run(MyApplication.class, args)這…

SkiaSharp 之 WPF 自繪 投籃小游戲(案例版)

此案例主要是針對光線投影法碰撞檢測功能的示例&#xff0c;順便做成了一個小游戲&#xff0c;很簡單&#xff0c;但是&#xff0c;效果卻很不錯。投籃小游戲規則&#xff0c;點擊投籃目標點&#xff0c;就會有一個球沿著相關拋物線&#xff0c;然后&#xff0c;判斷是否進入籃…

zuul集成ribbon完成服務通信和負載均衡

目錄 Zuul2服務通信 超時相關 默認超時配置 自定義超時配置 負載均衡 Zuul2服務通信 描述&#xff1a;zuul2通過Ribbon完成客戶端負載均衡以及與服務器群集進行通信。 zuul2的通信是集成Ribbon實現的&#xff0c;在Origin中集成Ribbon基本配置&#xff08;例如IClientCo…

時任上海來伊份互聯網事業群總裁王戈鈞 :傳統企業(線上+線下)移動互聯網改造...

2017年12月22日-23日&#xff0c;第13屆信息化領袖峰會暨2017中國數字化貢獻人物頒獎盛典在上海盛大開幕。本次峰會由上海市經濟和信息化委員會指導&#xff0c;上海市國有資產信息中心、上海市計算機用戶協會、上海市信息服務業行業協會、上海大數據聯盟、上海市高等教育學會支…

Linux系統時間\硬件時間(date、tzselect、clock、hwclock、ntpdate)

1、系統時間和硬件時間 在Linux中有硬件時鐘與系統時鐘兩種時鐘。硬件時鐘是指主機板上的時鐘設備&#xff0c;也就是通常可在BIOS畫面設定的時鐘。系統時鐘則是指kernel中的時鐘。所有Linux相關指令與函數都是讀取系統時鐘的設定。因為存在兩種不同的時鐘&#xff0c;那么它們…

C#------如何判斷輸入的是否為純數字

private void Btn_OK_Click(object sender, EventArgs e){IDormitoryAdminCardService aservice new DormitoryAdminCardService();string text this.CardNoEdit.Text;//判斷是否輸入的是純數字string pattern "^[0-9]*$";Regex regex new Regex(pattern);if (re…

【.NET6+Modbus】Modbus TCP協議解析、仿真環境以及基于.NET實現基礎通信

接下來的內容&#xff0c;我會以從頭開發一個簡單的基于modbus tcp通信的案例&#xff0c;來實現一個基礎的通信功能。有關環境&#xff1a;開發環境&#xff1a;VS 2022企業版運行環境&#xff1a;Win 10 專業版.NET 環境版本&#xff1a;.NET 6【備注】 源碼在文末 1、新建一…

源碼深度剖析Eureka與Ribbon服務發現原理

本文基于 spring cloud dalston&#xff0c;同時文章較長&#xff0c;請選擇舒服姿勢進行閱讀。 Eureka 與 Ribbon 是什么&#xff1f;和服務發現什么關系&#xff1f; Eureka 與 Ribbon 都是 Netflix 提供的微服務組件&#xff0c;分別用于服務注冊與發現、負載均衡。同時&a…