聊一聊ABP vNext的模块化系统
官网:
https://abp.io/
开源:
https://github.com/abpframework/abp
EasyAbp:
https://easyabp.io/
Abp 模块:
https://abp.io/packages
模块化系统
ABP vNext 的世界观
在 Abp vNext 框架里面,模块系统是整个框架的基石,了解了模块系统以后,对于剩下的设计就很好理解了。
模块系统是就像上图乐高玩具一样,一块一块零散积木堆积起一个精彩的世界。每种积木的形状各不相同,功能各不相同,积木与积木直接互相依赖,互相支撑。
模块分两种类型. 它们没有任何结构上的差异,只是按照功能和目地分类:
框架模块:这些是框架的核心模块,像缓存、邮件、主题、安全性、序列化、验证、Ef Core集成、MongoDB集成...等等。它们没有应用程序/业务功能,但通过提供通用基础架构,集成和抽象会使你的日常开发更加容易。
应用程序模块:这些模块是实现特定的应用程序/业务功能,像 博客、文档管理、身份管理、租户管理... 等等。它是通常有自己的实体,服务,API和UI组件。
怎么使用模块?
Abp vNext
框架中这些模块怎么像积木一样互相拼装呢?
模块之间的拼装只有三步:
第一步:建立模块直接的依赖关系,可以通过
DependsOnAttribute
特性来确定依赖关系。第二步:先配置模块,实现为模块填充数据和功能设置。
第三步:使用模块提供的功能(接口)。通过功能接口来实现模块拼装。
public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddApplication<AppModule>(); //配置启动的 Abp模块}public void Configure(IApplicationBuilder app){app.InitializeApplication(); //初始化 Abp模块}}
怎么自定义模块?
Abp vNext
规定每个模块都应该定义一个模块类并且继承 AbpModule
抽象类。
通过
DependsOnAttribute
特性来关联需要使用的模块。通过重写
OnApplicationInitialization
方法来初始化模块。也可以配置AspNetCore
处理管道。通过重写
ConfigureServices
方法来配置模块。
[DependsOn(typeof(ModuleThree.ModuleThreeModule))]
[DependsOn(typeof(ModuleOne.ModuleOneModule))]
[DependsOn(typeof(AbpAspNetCoreMvcModule))]
public class AppModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){// 配置依赖注入}public override void
OnApplicationInitialization(ApplicationInitializationContext context){var app = context.GetApplicationBuilder();var env = context.GetEnvironment();app.UseStaticFiles();app.UseRouting();app.UseConfiguredEndpoints();}
}
AbpModule 深度剖析
ABP 系统在启动的时候才会通过反射扫描所有模块,每个模块可以通过 DependsOnAttribute
特性来确定依赖关系,使用拓扑排序算法,来根据依赖性确定模块的加载顺序。(从最深层的模块依次加载,直到启动所有模块)。
AbpModule
的提供一些方法来管理模块的生命周期。
ConfigureServices
:是将你的服务添加到依赖注入系统并配置其他模块的主要方法。OnApplicationInitialization
:初始化配置的所有模块的所有服务。OnApplicationShutdown
:如果要在应用程序关闭时执行。... 还有其他方法用的不多,下面流程图会有简单说明。
下面这个流程图简单阐述 AbpModule
提供的方法之间的执行顺序。
AbpModule
类源代码:
https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs
举一个定时发邮件例子来说明这三个方法用处。
自定义了一个定时发邮件模块
SendMailModule
模块并且继承AbpModule
。在
ConfigureServices
方法中配置定时发送的时间和发送邮箱的地址,邮件模块信息等。配置好模块之后,在
OnApplicationInitialization
方法中启动定时器,进行定时发送邮件。当系统停止后需要提醒运维人员,在
OnApplicationShutdown
方法中发送一封邮件给运维人员。
ABP 模块化依赖价值流程
下面日志阐述AbpModule
提供的方法在有模块依赖的情况下之间的执行顺序。
上图的执行顺序的演示代码:
AbpModuleDemo.7z
总结
Abp vNext
是一个模块化设计,提供了高扩展性、高可用性、高效率开发框架。要实现高效率前提还需要熟练了解使用 Abp 中的所有模块功能。通过模块设计也可以很快定制一下功能以及更好的单元测试。
Abp vNext
模块设计是直接采用 Asp.NetCore
的原有功能,扩展了 Startup.ConfigureServices
和 Startup.Configure
方法,把方便我们在开发模块的时候直接使用 IServiceCollection
和 IApplicationBuilder
。
模块设计原则
单一原则。每个模块只有一个功能,有着清晰的边界,实现高度解耦和高度可复用性。
DDD领域设计。通过领域设计思想确定模块的领域边界,避免模块化过于细化导致增加复杂程度。
模块使用常见问题
模块化过于细化,很容易陷入模块的迷宫中。导致学习成本暴增。
模块功能文档不清晰,使用起来问题频出。
模块之间的过于依赖,对模块设计和功能不了解时,很难定位问题。
引用
Abp vNext 源码分析
https://www.cnblogs.com/myzony/p/10722506.html
官方文档
https://docs.abp.io/zh-Hans/abp/latest/Module-Development-Basics
转载是一种动力 分享是一种美德
作者:阿凌
【版权声明】作品来自于长沙.NET技术社区成员【阿凌】,有兴趣了解长沙.NET技术社区详情,请关注公众号【DotNET技术圈】,作品版权归作者和博客园共有,作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
QQ群:
编程交流群<85318032>
产品交流群<897857351>
聊一聊ABP vNext的模块化系统相关推荐
- Abp vNext 二进制大对象系统(BLOB)
一.简介 ABP vNext 在 v 2.9.x 版本当中添加了 BLOB 系统,主要用于存储大型二进制文件.ABP 抽象了一套通用的 BLOB 体系,开发人员在存储或读取二进制文件时,可以忽略具体实 ...
- 我和ABP vNext 的故事
Abp VNext是Abp的.NET Core 版本,但它不仅仅只是代码重写了.Abp团队在过去多年社区和商业版本的反馈上做了很多的改进.包括性能.底层的框架设计,它融合了更多优雅的设计实践.不管你是 ...
- Abp vNext 模块化
Abp vNext 在Abp vNext框架当中呢,模块化管理可以说是最基本的要求,他把程序按照模块进行切分,模块之间也存在相互依赖的关系,当然模块切分可以按照业务,也可以按照功能,最后一个一个组装拼 ...
- ABP vnext模块化架构的最佳实践的实现
在上一篇文章<手把手教你用Abp vnext构建API接口服务>中,我们用ABP vnext实现了WebAPI接口服务,但是并非ABP模块化架构的最佳实践.我本身也在学习ABP,我认为AB ...
- [Abp vNext 源码分析] - 2. 模块系统的变化
一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...
- ABP vNext微服务架构详细教程——简介
简介 该系列文章主要展示ABP vNext框架在微服务架构下的用法,提供一套可落地的技术实现思路,并演示各服务在Kubernetes下的部署方案. 基础概念 ABP vNext 基于ASP.NET C ...
- [Abp vNext 源码分析] - 18. 单元测试
简介 ABP vNext 框架使用 xUnit 作为单元测试组件,官方的所有模块都编写了大量的 单元/集成测试 确保功能正常.由于 ABP vNext 模块化系统的原因,开发人员在建立单元测试项目的时 ...
- ABP VNext从单体切换到微服务
注:此处的微服务只考虑服务部分,不考虑内外层网关.认证等. ABP VNext从单体切换到微服务,提供了相当大的便利性,对于各模块内部不要做任何调整,仅需要调整承载体即可. ABP can help ...
- ABP VNext实践之搭建可用于生产的IdentityServer4
一.前言 用了半年多的abp vnext,在开发的效果还是非常的好,可以说节省了很多时间,像事件总线.模块化开发.动态API进行远程调用.自动API控制器等等,一整套的规范,让开发人员更方便的集成,提 ...
最新文章
- execute、executeQuery和executeUpdate之间的区别
- 安装yaml报错:ERROR: Cannot uninstall 'PyYAML'.
- 你真的理解零拷贝吗?
- 路径规划算法之Bellman-Ford算法
- Cascade R-CNN
- 2020 华为杯 数模 B题 数据挖掘
- python背景怎么自定义铃声_Python 上课铃声的定时播放(具有较强的自我管理能力.jpg)...
- 记住:永远不要在MySQL中使用UTF-8
- BFS--常用模板及实际应用
- 扇贝python课程免费_扇贝新推出的python课程值得买吗?
- 3.3 三极管的的概念及其工作原理
- 第九届山东理工大学ACM网络编程擂台赛 F题题解
- iOS——应用内调用Face ID、Touch ID
- 财会法规与职业道德【19】
- 【上班那点事】TO, CC, BCC-办公室邮件门道知多少
- 大一下学期计算机基础,计算机基础复习(大一)
- 如何用计算机给闺蜜表白,闺蜜情话最暖心短句50句
- 数据结构算法实现及例题
- NSString 遇到的坑
- 青柠疫服自动打卡脚本