初识 ABP 框架

2023-10-31

前言:

本文使用 .NET Core SDK 3.1 的版本。
ABP Framework 在2013年就有了,至今为止出现过很多版本,
在.NET Core出现后,ABP 也发生了巨大的改变,当前版本早期为了与之前的版本进行区分叫做 Abp vNext,
现在Abp vNext已经成熟可以商用了,vNext 就不再存在,实际上他的名字就叫 ABP Framework。

一、创建ABP应用的方式

创建ABP应用有三种方式:

  1. 使用ABP的模板,按照官网指示安装 ABP CLI,使用 ABP CLI 创建项目
  2. 使用ABP的模板,直接在官网填写基本信息直接下载
  3. 在 Visual Studio 中创建 ASP.NET Core 新项目,引入 ABP 相关的包。
    如果是快速开发可以使用 ABP 的模板,因为生成的项目比较复杂。如果想深入定制手动创建项目再引入 ABP 相关的包比较好。

二、运行基于ABP的控制台应用

创建一个基于 .NET Core 的控制台应用,可通过 Visual Studio 创建,也可以使用命令行创建。

> dotnet new console -n HelloAbp

引入所依赖的NuGet包,Microsoft.Extensions.DependencyInjection 和 Volo.Abp.Core。

> dotnet add package Microsoft.Extensions.DependencyInjection -v 5.0.1
> dotnet add package Volo.Abp.Core -v 4.3.3

一个Abp应用就至少需要一个模块,在Abp里面模块是以类的形式表现的,
创建一个名为 HelloAbpModule 的类,继承 AbpModule 类,这就是所谓的模块。

    public class HelloAbpModule : AbpModule
    {       
    }

模块本身是没有业务逻辑的,所以我们需要一个服务。
由于Abp使用了依赖注入,要在Abp中使用服务,就需要对相应的服务进行注册。
不过有些内容不需要我们手动注册,Abp可以按照约定去注册常见的服务类型,Abp可以通过接口实现自动注册。
创建一个 HelloAbpService.cs 服务,并实现 ITransientDependency 接口,使其在程序启动时自动注册。

    public class HelloAbpService : ITransientDependency
    {
        public void Run() => Console.WriteLine("Hello Wordld");
    }

修改 Main 函数使程序能够按照我们想要的方式执行。

    static void Main(string[] args)
    {
        // 一个模块类代表一个模块,在一个项目里一般只有一个模块类,
        // 通过启动模块来创建Abp的应用对象
        var app = AbpApplicationFactory.Create<HelloAbpModule>();
        // 初始化Abp应用对象 
        app.Initialize();
    
        // 在应用对象的服务容器中拿到业务服务类
        // 需要安装 Microsoft.Extensions.DependencyInjection 依赖注入的包
        var service = app.ServiceProvider.GetService<HelloAbpService>();
        service.Run();
    }

三、运行基于ABP的Web应用

创建一个基于 .NET Core 的 ASP.NET Core Web API 项目,可通过 Visual Studio 创建,也可以使用命令行创建。

> dotnet new webapi -n Sample.Abp

引入所依赖的NuGet包 Volo.Abp.AspNetCore.Mvc。

> dotnet add package Volo.Abp.AspNetCore.Mvc -v 3.3.2

创建一个Abp的模块作为启动模块 AppModule 并继承 AbpModule,

    public class AppModule : AbpModule
    {
    }

由于现在是基于Abp框架,
中间件管道的配置就不在Startup中配置了,而是转移到启动模块中进行配置。
如果要在启动模块中进行配置管道,
那么还需要为启动模块添加它所依赖的其他模块,通过特性 DependsOn 定义模块间的依赖关系

    // 通过特性添加当前模块所依赖的其他模块 
    [DependsOn(typeof(AbpAspNetCoreMvcModule))]
    public class AppModule : AbpModule
    {
    	// TODO:
    }

管道的配置在应用启动时进行,
在AbpModule中有一个名为 OnApplicationInitialization 的应用初始化方法,
一般在该方法中配置中间件管道 我们需要在AppModule中复写他,

    public class AppModule : AbpModule
    {
        public override void OnApplicationInitialization(
            ApplicationInitializationContext context)
        {
            var app = context.GetApplicationBuilder();
            var env = context.GetEnvironment();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

而现在的 Startup 职责是初始化Abp,

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplication<AppModule>();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.InitializeApplication();
        }
    }

完成Abp框架的配置后,之后的开发基本完全一样。
如果想创建一个控制器,现在是继承 AbpController 而不是 ControllerBase,
由于使用了Abp的控制器,把管道中配置终结点的方法删掉换为Abp的提供的终结点方法。

        public override void OnApplicationInitialization(
            ApplicationInitializationContext context)
        {
            var app = context.GetApplicationBuilder();
            var env = context.GetEnvironment();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseRouting();
            app.UseAuthorization();
            // 替换默认的终结点
            app.UseConfiguredEndpoints();
        }

添加一个 基于 AbpController 的 Action。

    public class HomeController : AbpController
    {
        public IActionResult Index()
        {
            return Content("Hello World");
        }
    }

本地启动项目,访问 ~/home/index 即可得到 Hello World 。

四、Abp中的注入

自动注入服务需要实现对应的接口,例如瞬时的需要实现 ITransientDependency,而另外两个是 IScopedDependencyISingletonDependency

    public class HelloAbpService : ITransientDependency
    {
        public void Run() => Console.WriteLine("Hello Wordld");
    }

或者使用特性

    [Dependency(ServiceLifetime.Transient)]
    public class HelloAbpService
    {
        public void Run() => Console.WriteLine("Hello Wordld");
    }

手动注入和 ASP.NET Core 一样,依旧是在 IServiceCollection 对象中注入配置,
不过配置注入的位置不一样,需要重写 AbpModule 的 ConfigureServices 方法。

    public class HelloAbpModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            context.Services.AddTransient<HelloAbpService>();
            // context.Services.AddScoped<HelloAbpService>();
            // context.Services.AddSingleton<HelloAbpService>();
        }
    }

五、模块的生命周期

ValidateErrorImg
一个模块的生命周期可以粗略分为 模块配置、模块初始化和模块销毁,如上图所示可以重写相应的方法。
在 ASP.NET Core 的 Startup 中的 ConfigureServices 与 AbpModule 的 ConfigureServices 相对应,
而 Startup 中的 Configure 与 AbpModule 的 OnApplicationInitialization 相对应。

关于模块的依赖关系
一个模块可能依赖于多个其他的模块,而他们之前的依赖关系决定了模块的加载和启动顺序,在Abp中使用了拓扑排序算法来计算模块的加载顺序。

启动流程

  1. 注册ABP基础设施与核心服务
  2. 加载整个应用的所有模块,按照依赖进行排序
  3. 按顺序遍历所有模块,执行每一个模块的配置方法(3个)
  4. 按顺序遍历所有模块,执行每一个模块的初始化方法(3个)

参考文档

ABP Framework - Open Source Web Application Framework

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初识 ABP 框架 的相关文章

随机推荐

  • jar包里class文件如何替换?

    1 将jar包先解压成文件 2 替换对应目录文件 3 windows环境进入要打jar包的文件目录底下 按住shift右键打开命令窗口 默认进入到了对应目录底下 4 使用命令打包文件底下的所有文件 jar cf0M jar包名 jar 5
  • 使用commons-httpclient上传文件

    这个jar是jakarta官方的标准版本 现在的3 0的BETA已经出来了 但是稳定还是最重要的 这个东西到底有什么好处呢 他使利用java作为一个HTTP的客户端成为可能 基本能模拟一切HTTP客户端的访问模式 而其使用起来之简单 让以前
  • pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

    前言 笔者使用的是 pycharm 1 打开你所在的任意工程 2 进入 File gt setting 3 pip 这一栏进行双击 4 点击左下方的 install package 开始下载安装包 5 借助 everything 工具 找到
  • FreeRTOS学习简易笔记

    第1章 FreeRTOS引入及堆栈 1 1 FreeRTOS学习三阶段 1 理解RTOS总原理 会移植官方Demo 会使用 2 知道内部机制 源码还没看 3 知道内部实现 能看懂源码 并能轻松移植任何单片机 1 2 RTOS操作系统 与 裸
  • 最详细小白入门Python4-变量

    变量特性 容器 临时 可变 变量定义的格式 变量名 值 标识符的命名规则 只能是数字字母下划线组成 首字母不能是数字 严格区分大小写 不能是关键字 在Python中定义变量必须赋值 否则报错 牛奶和可乐交换的案例 交换方式 获取一个空杯子
  • 大数据运维学习之路

    业内有这么一句话说 云计算可能改变了整个传统IT产业的基础架构 而大数据处理 尤其像Hadoop组件这样的技术出现 将是改变IT业务模式的一种技术 另外 很多小伙伴可能还搞不明白云和Hadoop有什么关系 事实上这是两种截然不同的技术 今天
  • [datawhale202302]CS224W图机器学习:图的基本表示及特征工程

    结论速递 本章涉及了图基本表示及传统的特征工程 图由节点和连接组成 节点和连接上都可以有不同的属性 根据属性的特点 分为几类不同的图 其中异质图和二分图是比较重要的特殊图 图可以用邻接矩阵进行结构化表示 如果图过于稀疏 也可以使用连接列表和
  • c语言单例模式,c#单例模式(Singleton)的6种实现

    1 1 1 摘要 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例 如 IO处理 数据库操作等 由于这些对象都要占用重要的系统资源 所以我们必须限制这些实例的创建或始终使用一个公用的实例 这就是我们今天要介绍的 单例模式 Singl
  • SecureCRT的设置

    转载 简要介绍 VanDyke CRT 和 VanDyke SecureCRT是最常用的终端仿真程序 简单的说就是windows下登录UNIX或Liunx服务器主机的软件 二者不同的是SecureCRT支持SSH SSH1和SSH2 本文主
  • python基础 四、面向对象

    第六章 面向对象 继承 多继承 class FooParent object def init self self parent I m the parent print Parent def bar self message print
  • dicom信息+dcmtk使用

    dcmtk使用 常见错误 错误 E can t load data dictionary W Monochrome encoder No data dictionary 解决 https forum dcmtk org viewtopic
  • Internet路由之路由表查找算法概述-哈希/LC-Trie树/256-way-mtrie树

    说明 本文没有源码分析的内容 然而我认为能理解本质比能看懂源码更有用 因为理解了本质之后 你也许就不用再看源码了 你甚至都可以写源码了 这就是Linux内核和Cisco的网站中包含大量文档的原因 引 路由是互联网的一个核心概念 广义的讲 它
  • js深克隆五种方法

    使用递归 使用递归的方式实现数组 对象的深拷贝 判断拷贝的要进行深拷贝的是数组还是对象 是数组的话进行数组拷贝 对象的话进行对象拷贝 进行深拷贝的不能为空 并且是对象 function cloneDeep obj var objClone
  • DRC设计规则设置介绍-Design Compiler(四)

    文章目录 4 1 设计规则相关命令设置 4 1 1 set load 输出驱动强度 4 1 2 set input transition 输入驱动强度 参考文档 系列学习介绍DC相关知识 包括ASIC基本单元相关 DC指令工艺库脚本相关 后
  • mysql 的帐号认证和权限控制

    在 mysql 的语句处理流程 中 有两处进行了权限的管理 分别为 authentication 和 access control 1 authentication是使用user 用户名 和host 客户端主机 以及password对客户端
  • 1、ROS常用命令以及调参工具

    1 ROS常用命令以及调参工具 简介 1 1 常用命令的使用 学习目标 工作任务 1 1 常用命令的使用 简介 ROS机器人操作系统提供了一种发布 订阅式的通信框架 非常简单方便 并且ROS提供了大量工具用于调试 可视化 测试数据 本节项目
  • ABCD+5G之D——大数据(Big Data)

    学习自网易公开课厦门大学公开课 一 大数据概述 1 大数据时代
  • git本地免密码和账号pull、push

    说明 HOME 一般为C users Administrator 也可以是你自己创建的系统用户名目录 反正都在C users 中 一 windows下 需要创建一个 git credentials文件 由于在Window中不允许直接创建以
  • Visual Studio Code怎么停止正在运行的Python脚本?

    有时候 写了无限循环的脚本 又或者脚本还没有运行完毕 却想要终止它 比如 这个无限循环的命令 import datetime now datetime datetime now h now hour while h lt 25 print
  • 初识 ABP 框架

    目录 前言 一 创建ABP应用的方式 二 运行基于ABP的控制台应用 三 运行基于ABP的Web应用 四 Abp中的注入 五 模块的生命周期 参考文档 前言 本文使用 NET Core SDK 3 1 的版本 ABP Framework 在