前言

ABP vNext(以下简称ABP)的前身是asp.net boilerplate(老版abp),它不是一个简单的版本更新,而是完全基于.NET Core的重写。之前有听说过ABP框架,但是一直没有去详细了解。最近认真学习了一下,准备记录下自己的一些心得,计划分为3部分来进行:

  1. ABP基础(就是官网上一些基本的功能)
  2. ABP实战(使用ABP+vue开发一个简单项目)
  3. ABP模块化(微服务简单介绍)

首先,这是以一个0基础的视角去写的,所以会比较基础,适合新手。文中如果有不对的地方,大家可以帮我指出来相互学习。。。

开始

ABP官网:https://www.abp.io/

ABP GitHub:https://github.com/abpframework/abp

要学习ABP,首先肯定要认真看一下官方的文档,虽然目前官方文档还不完整;然后对哪一部分不理解的,可以适当的阅读一下源码。

ABP是基于DDD:Domain-Driven Design(领域驱动设计)去开发的,当然框架本身不强制你使用DDD,但是他建议把DDD作为最佳实践。如果了解DDD,并且使用过老版本abp的话,看官方文档可能就比较轻松,反之则会比较吃力。。。首先DDD理论就非常抽象和复杂,要深刻理解它并不容易;其次是ABP内部使用了很多开源组件,比如EF Core,IdentityServer4,Autofac,AutoMapper,Swagger等等,所以也需要对这些组件有所了解。

本篇简单介绍一下ABP官方文档上一些重要的关键字,先理解这些关键字,才能更好的进一步学习。

审计(Audit)

审计是用于追踪数据变化的过程。平时开发中,你一定经常见到类似创建时间、创建人、修改时间、修改人等属性,这些属性就是用于数据审计。ABP框架提供了一些接口和基类来标准化这些属性,并自动设置它们的值;并且ABP提供了一个可扩展的审计日志系统,自动化的根据约定记录审计日志,并提供配置来控制审计日志的级别。ABP中审计相关基类/接口有:IAuditedObjectAuditedEntityAuditedAggregateRoot等等。

本地化(Localization)

使应用程序支持多国语言。ABP的本地化系统与ASP.NET Core的本地化兼容。

事件总线(Event Bus)

事件总线是对观察者(发布-订阅)模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。

如果没有接触过Event Bus,可能不太好理解。一个不太恰当的例子:A需要租房,B需要把房子租出去,A想直接找到B是比较困难的,A也不想去认识B,所以才有房产中介C,C就是Event Bus;B提前跟C说我的房子需要出租,A跟C说我给你钱你帮我租一个房,那么C很容易就帮A找到B完成租房,A甚至不需要知道B是谁,这里A就是事件的发布者,B是事件的订阅者。ABP支持本地Event Bus和分布式Event Bus。

多租户(multi-tenancy technology)

多租户是一种软件架构技术,这种架构可以让多个租户共用相同的系统,并且可以确保各租户间数据的隔离性。相信很多人都遇到过类似需求,同一个系统中根据不同客户区分数据;通常我们会在数据库表中增加一个客户Id作为标识,或者根据不同客户读取不同的数据库,这都是多租户数据隔离的实现方式,想自己很好的实现多租户还是很繁琐的。ABP的多租户模块提供了创建多租户应用程序的基本功能,可以很轻松的帮你实现多租户。

DDD分层

  • 表示层: 为用户提供接口,使用应用层实现与用户交互。
  • 应用层: 表示层与领域层的中介,编排业务对象执行特定的应用程序任务,使用应用程序逻辑实现用例。
  • 领域层: 包含业务对象以及业务规则,是应用程序的核心。
  • 基础设施层: 提供通用的技术功能,支持更高的层,主要使用第三方类库。

实体(Entity)

一个没有从其属性,而是通过连续性和身份的线索来定义的对象。

官方文档中这句话非常难理解。。。

简单来说,当一个对象只能由他的标识(Id)来区分,而不是从其他属性来区分时,这种对象被称为实体。比如有很多叫“张三”的男人,你不能通过姓名和性别来区分到底是哪个张三,只能通过Id。实体是可以持续变化的,我们可以对实体进行多次修改,但是无论怎么修改,实体始终拥有它唯一的标识。DDD中的实体通常都是充血模型,充血模型就是实体中不光有属性,还会包含行为(方法),反之DTO,ViewModel就是典型的贫血模型。实体通常映射到关系型数据库的表中,ABP中实体相关的基类/接口有:EntityIEntityAuditedEntity等等。

值对象(Value Object)

值对象和实体恰好相反,它不需要唯一标识,并且它不可以被改变。值对象通常是用来度量和描述事物,当你只关注某个对象的属性时,该对象便可以是一个值对象。比如“北京”就是“北京”,不存在Id=1或者Id=2的北京的说法。当然,值对象虽然不存在唯一标识,但是不代表它在数据库中就没有Id主键。。。

聚合根(Aggregate Root)

聚合是业务逻辑紧密关联的实体和值对象组合而成,聚合是数据修改和持久化的基本单元,聚合后产生的根实体称为聚合根。若一个聚合仅有一个实体,那这个实体就是聚合根。聚合根被视为一个单元,你不能单独去修改聚合根中的子实体。例如,某个业务流程中,会操作A、B、C、D四个对象(简单理解为数据库表),那么将ABCD聚合,产生一个聚合根E,对外部来说只需要操作E就可以了,领域内部会处理好ABCD。这样一方面避免了多个对象的混乱,另一方面也保证了数据的完整性,不会出现AB操作成功了,CD操作失败了,导致数据库产生脏数据。

聚合根引用聚合根:通过ID。

聚合根引用实体:通过对象(导航属性)。

聚合根引用值对象:通过对象(导航属性)。

仓储(Repository)

仓储用于操作领域对象(实际就是操作数据库),通常会为每个聚合根或不同的实体创建对应的仓储。ABP也提供了通用的泛型仓储:IRepository<TEntity, TKey>,内置了增删改查基本功能,直接注入就可以使用。

应用服务(Application Services)

应用层处于展示层与领域层之间,展示层通常调用应用服务,应用服务调用领域然后返回数据给展示层。展示层也可以直接调用领域。APB中应用服务相关的基类/接口有:IApplicationServiceApplicationServiceICrudAppServiceCrudAppService等等。

数据传输对象(DTO)

通常领域对象不适合直接在应用层与展示层之间传递,比如User中的Passwod字段,这时候就需要用到DTO,DTO和ViewModel类似。ABP提供了一些DTO基类/接口:IEntityDtoEntityDtoAuditedEntityDto等等。

工作单元(Unit Of Work)

UOW模式是为了保证一次业务操作的数据完整性。ABP框架的UOW实现提供了对应用程序中的数据库连接和事务范围的抽象和控制,使用ABP的话通常你不用自己去写数据库事务相关代码。实际上工作单元不一定非要创建数据库事务,比如HTTP GET请求就不会启动事务性UOW,它们仍然启动UOW,但不创建数据库事务。这一切都由ABP框架自动完成。

最后

目前关于ABP的学习资源比较少,官方的文档也还没写完。。。不过ABP的作者最近开始发布自己的教学视频了,有条件的可以自行搜索一下。

初识ABP vNext(1):开篇计划&基础知识的更多相关文章

  1. 初识ABP vNext(2):ABP启动模板

    目录 前言 开始 AbpHelper 模块安装 最后 前言 上一篇介绍了ABP的一些基础知识,本篇继续介绍ABP的启动模板.使用ABP CLI命令就可以得到这个启动模板,其中包含了一些基础功能模块,你 ...

  2. 初识ABP vNext(8):ABP特征管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 定义特征 应用特征 用户数量 社交登录 最后 前言 上一篇提到了ABP功能管理(特征管理),它来自ABP的Featur ...

  3. 初识ABP vNext(9):ABP模块化开发-文件管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 创建模块 模块开发 应用服务 运行模块 单元测试 模块使用 最后 前言 在之前的章节中介绍过ABP扩展实体,当时在用户 ...

  4. 初识ABP vNext(12):模块的独立运行与托管

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 模块运行 动态 C# API 客户端 最后 前言 很久没更新这个系列...之前的章节中讲到ABP的模块是可以独立运行的 ...

  5. 初识ABP vNext(3):vue对接ABP基本思路

    目录 前言 开始 登录 权限 本地化 创建项目 ABP vue-element-admin 最后 前言 上一篇介绍了ABP的启动模板以及AbpHelper工具的基本使用,这一篇将进入项目实战部分.因为 ...

  6. 初识ABP vNext(4):vue用户登录&菜单权限

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 登录 菜单权限 运行测试 最后 前言 上一篇已经创建好了前后端项目,本篇开始编码部分. 开始 几乎所有的系统都绕不开登 ...

  7. 初识ABP vNext(5):ABP扩展实体

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 扩展实体 路由整理 最后 前言 上一篇实现了前端vue部分的用户登录和菜单权限控制,但是有一些问题需要解决,比如用户头 ...

  8. 初识ABP vNext(6):vue+ABP实现国际化

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 语言选项 语言切换 注意 最后 前言 上一篇介绍了ABP扩展实体,并且在前端部分新增了身份认证管理和租户管理的菜单,在 ...

  9. 初识ABP vNext(7):vue身份认证管理&租户管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 按钮级权限 身份认证管理 R/U权限 权限刷新 租户管理 租户切换 效果 最后 前言 上一篇介绍了vue+ABP国际化 ...

随机推荐

  1. 数据结构C语言实现----出队伍操作

    1.创建一个队列时,空队列中队首和队尾相同,但不是NULL,队首后面挂的元素才是NULL 2.打印队列时,对于链队列,不能把指针加一来找到下一个数据,因为链表地址不连续,需要复制一条链表,不断往后遍历 ...

  2. python怎么自学?今日头条技术大佬的真实经历分享

    大家好,我是武州,27岁,目前在字节跳动担任Python后端工程师一职. (摆拍一下,假装是保安) 在开始今天的文章之前,不知道你们有没有遇到过这样的问题: 大学没学到什么实质技术,毕业后找不到高薪的 ...

  3. accpet和connect设置超时

    三次握手 TCP连接建立的开始是三次握手,通过三次交互确认连接成功,在客户端调用connect时,客户端发送sync消息给服务端,服务端收到sync消息后,返回一个ack+sync,并等待ack,客户 ...

  4. python如何编写win程序

    python可以编写win程序.win程序的格式是exe,下面我们就来看一下使用python编写exe程序的方法. 编写好python程序后py2exe模块即可将其打包为exe程序. 实际操作过程: ...

  5. Java应用服务器之tomcat会话复制集群配置

    会话是识别用户,跟踪用户访问行为的一个手段,通过cookie(存在客户端)或session(存在服务端)来判断本次请求是那个客户端发送过来:常用的会话保持有绑定会话,就是前边我们聊的在代理上通过算法或 ...

  6. OFDM通信系统的MATLAB仿真(2)

    关于OFDM系统的MATLAB仿真实现的第二篇随笔,在第一篇中,我们讨论的是信号经过AWGN信道的情况,只用添加固定噪声功率的高斯白噪声就好了.但在实际无线信道中,信道干扰常常是加性噪声.多径衰落的结 ...

  7. ContiPerf

    概述 ContiPerf 是一个轻量级的单元测试工具,基于JUnit 4二次开发,使用它基于注解的方式,快速在本地进行单元压测并提供详细的报告. Example 1. 新建 SpringBoot 工程 ...

  8. EOJ Monthly 2019.11 A(进制转换)

    "欢迎您乘坐东方航空公司航班 MU5692 由银川前往上海......" "我们的飞机很快就要起飞了,请收起小桌板,摘下耳机......" 收起了小桌板,摘下了 ...

  9. 看了这篇你就会手写RPC框架了

    一.学习本文你能学到什么? RPC的概念及运作流程 RPC协议及RPC框架的概念 Netty的基本使用 Java序列化及反序列化技术 Zookeeper的基本使用(注册中心) 自定义注解实现特殊业务逻 ...

  10. 【接单】找我付费定制Python工具软件或网站开发、Chrome浏览器插件、油猴脚本

    各位可付费找我定制Python工具软件或网站开发.Chrome插件.油猴脚本.自动化软件,可通过我做的软件来评判我的实力,一定要先和我沟通你的需求,做不了的我也不会接. 费用50元起,通过淘宝APP或 ...