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.mzph.cn/news/284000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]Eureka工作原理

目录 Eureka 工作原理 Eureka 核心概念 自我保护机制 Eureka 集群原理 Eurka 工作流程 总结 Eureka 工作原理 上节内容为大家介绍了&#xff0c;注册中心 Eureka 产品的使用&#xff0c;以及如何利用 Eureka 搭建单台和集群的注册中心。这节课我们来继续学习 Eureka&…

重谈联想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;一个替代侧边栏的新组件。它主要用于移动应…

[转]高并发架构设计之--「服务降级」、「服务限流」与「服务熔断」

目录 服务降级 1 、简介 2 、使用场景 3 、核心设计 3.1 分布式开关 3.2 自动降级分类 3.3 配置中心 3.4 处理策略 3.5 降级分类 3.6 服务降级要考虑的问题 4 、高级特性 4.1 分级降级 4.2 降级权值 5 、总结与展望 服务限流 一、为什么要做服务限流设计&…

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;上海市国有资产信息中心、上海市计算机用户协会、上海市信息服务业行业协会、上海大数据联盟、上海市高等教育学会支…

【.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…

std的find和reverse_iterator联合使用

上代码&#xff1a; // test2013.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include<iostream> #include<vector> #include<map> #include<string> using namespace …

论如何提升学习的能力

为啥要学习如果有一件事情是能改变你自己的&#xff0c;我想这件事情必然就是学习&#xff0c;我的人生重要的转折点也是从学习这件事情始发的&#xff0c;那么&#xff0c;我们就从这里开始。学习不仅仅是为了找到答案&#xff0c;而是为了找到方法&#xff0c;找到一个可以找…

CSS布局解决方案(终结版)

前端布局非常重要的一环就是页面框架的搭建&#xff0c;也是最基础的一环。在页面框架的搭建之中&#xff0c;又有居中布局、多列布局以及全局布局&#xff0c;今天我们就来总结总结前端干货中的CSS布局。 居中布局 水平居中 1&#xff09;使用inline-blocktext-align&#xff…

基于ABP和Magicodes实现Excel导出操作

前端使用的vue-element-admin框架&#xff0c;后端使用ABP框架&#xff0c;Excel导出使用的Magicodes.IE.Excel.Abp库。Excel导入和导出操作几乎一样&#xff0c;不再介绍。文本主要介绍Excel导出操作和过程中遇到的坑&#xff0c;主要是Excel文件导出后无法打开的问题。一.Mag…

消息模式在实际开发应用中的优势

曾经.NET面试过程中经常问的一个问题是&#xff0c;如果程序集A&#xff0c;引用B &#xff0c;B 引用C&#xff0c;那么C怎么去访问A中的方法呢。 这个问题初学.net可能一时想不出该咋处理&#xff0c;这涉及到循环引用问题。但有点经验的可能就简单了&#xff0c;通过委托的方…

微服务:注册中心ZooKeeper、Eureka、Consul 、Nacos对比

前言 服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务&#xff0c;原则上都应存在或者支持多个提供者&#xff0c;这是由微服务的分布式属性决定的。更进一步&#xff0c;为了支持弹性扩缩容特性&#xff0c;一个微服务的提供者的数量和分布往往是动…