当前位置: 首页>资讯 >

ABP - 模块加载机制_天天百事通

来源: 博客园 | 时间: 2023-05-16 14:28:34 |

Abp是一个基于模块化开发的应用程序框架,提供了模块化基础的架构和模块化加载的引擎。

理解模块

一个模块是对一个功能点的封装,可以独立成为一个包,实现了松耦合的代码组织方式。Abp框架的基本思想就是模块开发,模块就想乐高中的一块块积木,在项目中将不同功能点的模块引用进来,就像搭积木一样构建成一个成品。

模块化的实现

通过在一个程序集中,创建一个模块类,继承AbpModule类,就可以很简单的将这个程序集作为Abp框架中的一个模块。如下面的代码,就是一个模块类的定义。


【资料图】

[DependsOn(typeof(AbpAutoMapperModule),typeof(AbpDddApplicationModule),typeof(AbpObjectExtendingModule))]public class BaseApplicationModule : AbpModule{public override void ConfigureServices(ServiceConfigurationContext context){Configure(options =>{options.AddMaps();});}public override void OnApplicationInitialization(ApplicationInitializationContext context){base.OnApplicationInitialization(context);}}

AbpModule是 abp框架的模块基础类,一个类库可以通过一个继承此类的类,声明为一个模块。通过对AbpModule类的查看,可以看到这是一个抽象类,它很好的遵循了接口隔离原则。

一个模块就是一个完整的功能点,往往需要对其依赖的一些东西进行配置,如数据库连接、如配置文件读取等。Abp引擎通过将.net Core管道和容器传递,使得模块中可以配置自己的依赖注入和请求管道,而不需要在外部使用的时候添加一大堆配置,这样就达到了独立开放,开箱即用的目的。

通过重写PreConfigureServicesConfigureServicesPostConfigureServices这三个方法,可以在模块内部完成该模块的依赖注入配置。通过重写OnPreApplicationInitializationOnApplicationInitializationOnPostApplicationInitializationOnApplicationShutdown这四个方法可完成模块在应用程序生命周期中的配置,在应用程序启动或者停止的时候做一些操作,也可以对asp.net Core的请求管道进行操作,例如加入自己的中间件。这些方法大家也并不陌生,和Asp.net Core中Startup类中的方法类似。

模块之间可以引用,并且设置模块的依赖关系,一个模块加载时,会先加载其依赖的模块。通过DependsOnAttribute可以指定模块依赖的模块,形成一个依赖链,Abp引擎启动时加载模块时,会先加载依赖模块。

Volo.Abp.Core 核心包

Volo.Abp.Core是Abp框架的核心包,关于Abp模块化的实现都在这个包中,我们可以通过对这个包的源码的研究,看下Abp模块化的实现方式。

首先,从Volo.Abp.Core的源码中,可以看到这个包也依赖于一些第三方包。

Fody: 可以在编译过程中拦截vs行为,动态地将一些代码添加到dll中,实现静态AOP的功能。JetBrains: 提供一些数据标识,可以在编译期间对参数进行检查,减少bugNito:能够在使用Lock排他锁的时候,使用await异步的方式SoureLink:支持在安装nuget包之后,动态地从git中下载源码以供调试,需要在vs中设置启用源程序调试System.Collection.Immutable: 不可变集合,不可以往集合addSystem.Linq.Dynamic.Core:动态linq,将强类型的Linq表达式变成字符串的方式进行操作

模块加载过程

ABP框架的启动过程,最根本的就是模块的装载过程。

众所周知,asp.net core程序的启动类时startup类,而在abp框架中,startup类却很简单,虽然代码简单,但是这两个方法却不简单,正是通过这两个方法,将asp.net core中的请求转移到abp框架中来处理。

AddApplication()扩展方法作为入口,通过查看源码,可以看到内部是通过AbpApplicationFactory创建了一个abp应用程序的驱动AbpApplicationWithExternalServiceProvider,在这个驱动类中完成了对abp框架启动的配置和操作。

AbpApplicationFactory: abp应用启动的基本方式,是整个程序的入口,也是研究模加载机制的入口。根据使用的依赖注入容器的不同,提供两类的Create方法的重载。

应用程序引擎(容器)初始化时,通过应用程序引擎IAbpAppliaction,即AbpApplicationWithExternalServiceProvider,拿到各个模块信息(通过模块描述),执行各个模块中配置好的依赖注入。

而通过InitializeApplication(this IApplicationBuilder app)方法,可以看到也是通过容器拿到驱动,即AbpApplicationWithExternalServiceProvider示例,然后调用了Initialize(IServiceProvider serviceProvider)方法。

ABP框架应用程序启动,模块加载整个过程涉及到了AbpApplicationFactoryAbpApplicationWithExternalServiceProviderAbpApplicationBaseIModuleLoaderIModuleManager等类和接口,这里不好把这些源码都列出来,所以就整理了一下简单的流程和调用关系。见下图。

abp应用程序初始化过程图

以上,就是对Abp应用程序启动和模块加载机制的整理.

除此之外,volo.abp.core类库中还提供了一些工具类和扩展方法,都是很好用的,就算不用abp框架的童鞋也可以借鉴其中的写法,或者直接拿到自己项目中使用。

有兴趣的童鞋可以自己再仔细查看一下源码。

ABP 系列总结:

目录:ABP 系列总结上一篇:ABP - 初识 ABP

关键词:

 

热文推荐

ABP - 模块加载机制_天天百事通

Abp是一个基于模块化开发的应用程序框架,提供了模块化基础的架构和模块化加载的引擎。理解模块一个模块是

2023-05-16

乐坊的拼音_乐坊的意思 世界时快讯

1、善才?白居易的《琵琶行》(并序)中有 "善才 "一词, "本长安倡女,尝学琵琶于穆、曹二善才,年长色衰,

2023-05-16

同比增长514%!信阳港·淮滨中心港区2023年集装箱提前半年突破一万标箱-环球时讯

5月16日上午,信阳港·淮滨中心港区一派繁忙,作业码头上车辆川流不息,港池里的货船鸣笛声悦耳动听。在现

2023-05-16

南京中医药大学2023年硕士研究生调剂复试通知 (第一轮)

各位考生:按照我校2023年硕士研究生招生工作进程,现将我校2023年硕士研究生第一轮调剂复试工作要求公布如

2023-05-16

古装剧《折腰》官宣阵容,宋祖儿、刘宇宁、宣璐、刘端端领衔主演

新京报讯5月16日,古装爱情剧《折腰》官宣全阵容,将由宋祖儿、刘宇宁、宣璐、刘端端领衔主演,刘晓庆、何

2023-05-16

《乘风2023》:徐怀钰被指“划水”,冤吗? 精彩看点

《乘风2023》做到第四季了,固然人们多少担忧这个IP会进入审美疲劳,但上周末分为上下两期的首次公演播出后

2023-05-16

天天新动态:Mansory高尔夫球车是终极乡村俱乐部Flex

高尔夫一直是一项奢华和时尚的运动,而由Mansory重新设计的新款Garia高尔夫球车将其提升到一个全新的水平。Mans

2023-05-16

垂直型b2b概念_垂直型的b2b网站有哪些 环球视讯

1、蛋白质中酪蛋白,乳清蛋白,此外还有血清白蛋白。2、免疫球蛋白和酶。

2023-05-16

全球即时:日本东电公司门前民众集会反对福岛核污染水排海计划

当地时间16日上午,日本民众自发在东京电力公司本部门前举行反对福岛第一核电站核污染水排海计划集会。集会

2023-05-16

两市融资余额增加21.2亿元

每经AI快讯,截至5月15日,上交所融资余额报7997 75亿元,较前一交易日增加15 08亿元;深交所融资余额报723

2023-05-16

24城地铁账本:半数盈利下滑,谁拿补贴最多?

图片来源新华社在都市圈和城市群时代,地铁成为中心城市发挥辐射功能,实现城市资源要素配置乃至产城融合的

2023-05-16

美国有人对大疆下黑手了,事情很不简单

美国有人对大疆下黑手了,事情很不简单,美国,专利,飞机,无人机,大疆创新,德事隆公司,直升机公司

2023-05-16

环球快看点丨中信建投:AI加速普适化 有望实现普通大众层面的“破圈”;

中信建投:AI加速普适化有望实现普通大众层面的“破圈”;中信建投研报认为,AI应用正在加速普适化,此前3

2023-05-16

文科专业高考分数线 历年高考文科分数线_环球资讯

今天,大学路小编为大家带来了文科专业高考分数线历年高考文科分数线,希望能帮助到广大考生和家长,一起来

2023-05-16

大名城(600094):5月15日北向资金减持97.32万股_全球简讯

5月15日北向资金减持97 32万股大名城。近5个交易日中,获北向资金增持的有2天,累计净增持81 55万股。近20

2023-05-16

每日热闻!雄跨是什么意思_雄跨意思是什么

1、熊,发音为Xiongkua,是一个具有很高含义的中文单词。指站得高的人。大踏步前进。2、在世界桥梁史上,石

2023-05-16

瓦岗五虎八彪_瓦岗五虎

1、我们从《三国演义》《水浒传》《隋唐演义》中可以看到这么一个名词“五虎将”,三国五虎将,梁山五虎将

2023-05-16

【环球聚看点】年限平均法计算公式_折旧率年限平均法计算公式

1、就是基数的意思!你可由公式推导得出:年折旧率=年折旧额 固定资产原值*100%=(固定资产原值-残值) 预计使

2023-05-16

网帖举报长江大学学生P图盗用他人研究生录取信息,校方:正处理 天天观点

对于网帖反映的“长江大学地球科学学院学生侯某某P图盗用他人研究生录取信息骗取奖学金和荣誉”一事,长江

2023-05-15

阿里影业(01060.HK)将于5月31日举行董事会会议以审批末期业绩 环球新动态

格隆汇5月15日丨阿里影业公告,公司将于2023年5月31日举行董事会会议,藉以考虑及批准公司及其附属公司截至

2023-05-15