ABP 框架提供了一个稳定的架构用于构建企业级软件解决方案,[它遵循了.NET](http://xn--ykq892ae9cst8d.NET) 和 [ASP.NET](http://ASP.NET) Core 平台之上的最佳实践。它内置了基础架构、生产级别的模块、主题、工具、指南和文档,并尽可能地自动化开发细节和解法我们的重复性工作。
在接下来的几个小节中,我将从架构层面介绍 ABP是如何完成所有这些工作。
## 1 ABP 架构
ABP 是一个特殊的架构,换句话说,它是一个有个性化的框架。先解释一下什么是没有个性的框架,什么是有个性的框架。
正如我在*搭建架构*部分所述,为搭建解决方案的基础设施需要大量决策工作;比如系统架构、开发模型、技术、模式、工具和库。
没有个性的框架,例如 [ASP.NET](http://ASP.NET) Core,这些决定大多由您决定。例如,您可以通过将 UI 层与数据访问层分离来创建分层解决方案,或者您可以通过直接从 UI 页面/视图访问数据库来创建单层解决方案。您可以使用任何库,只要它与 [ASP.NET](http://ASP.NET) Core 兼容,并且您可以应用任何架构模式。无个性使 [ASP.NET](http://ASP.NET) Core 在不同的场景中变得灵活和可用。但是,所有的这些都需要我们自己去做决策。
我并不是说 [ASP.NET](http://ASP.NET) Core 完全没有自己的个性想法。假定您正在构建基于 HTTP 规范的 Web 应用程序或 API。它清楚地定义了应该如何开发 UI 和 API 层。它还提供了一些低级的基础设施组件,例如依赖项注入、缓存和日志记录。但是,它并没有说明您的业务代码是应该要如何组建,应该使用哪些架构模式。
换句话说,ABP 框架是一个有个性倾向的框架。它相信软件开发方法本质上可以更好,因此可以引导开发人员在解决方案中使用更佳的架构、模式、工具和库。
尽管 ABP 框架足够灵活,可以使用不同的工具和库来改变您的架构决策,但当您遵循它的实践原则时,您将获得最大的价值。请别担心,因为它为通用架构提供了良好的、行业认可的解决方案。他的架构规则将节省您的时间,提高您的生产力,并使您专注于您的业务代码而不是基础设施问题。
在接下来,我将介绍 ABP 所支持的四种基本架构。
### 1.1 领域驱动设计
ABP 的主要目标是根据整洁代码原则提供一个模型来构建易维护的解决方案。它提供了一个基于DDD 模式和实践的分层架构 。它提供了一个分层的启动模板、基础架构以及架构应用指南。
由于 ABP 是一个软件框架,它专注于 DDD 的技术实现。本书的第 3 部分,实现领域驱动设计,解释了使用 ABP 框架构建基于 DDD 的最佳实践。
### 1.2 模块化
在软件开发中,模块化是一种拆分系统成独立模块的技术。最终目标是降低复杂性,提高可重用性,使不同的团队能够在不相互影响的情况下能并行处理不同的功能集。
ABP构建模块化有两个主要挑战:
* 第一个挑战是模块隔离。[尽管ASP.NET](http://xn--ASP-9x0fp99k.NET) Core 有一些特性(例如 Razor 组件库)来支持模块化。但是,它仍然非常有限,因为它是一个底层通用的框架,并且仅对 UI 和 API 部分支持。另一方面,ABP 框架提供了一个一致的模型和基础设施来构建完全隔离的、可重用的应用模块及数据库、领域、应用和 UI 层。
* 第二个挑战是模块之间如何通信,使之成为一个统一的应用程序。ABP 为模块化系统提供常见的模型,例如在模块之间共享数据库,在模块之间通过事件或 API 进行通信,以及模块安装。
ABP 提供了许多可在任何应用程序中使用的预构建模块。包括身份验证模块,它提供用户、角色和权限管理,同时也提供登录和注册页面。他们基本上都是可重用和自定义的。此外,ABP 提供了模块启动模板,帮助您构建可重用的应用程序。这方面的一个例子可以在\[*第 15 章*\]使用模块化中详细介绍。
模块化非常适合管理复杂的大型单体系统。但是,ABP 也可以帮助您创建微服务解决方案。
### 1.3 微服务
微服务和分布式架构是构建可扩展系统的公认方法。它允许不同的团队开发不同的服务并独立地对服务进行单独部署和扩展。
但是,构建微服务系统在团队开发、部署、微服务间通信、数据一致性、监控等方面存在一些重要挑战。
微服务系统是一种将不同的学科、方法、技术和工具结合在一起来解决独特问题的解决方案。每个微服务系统都有其要求和限制。每个团队都有一定程度的专业知识、知识和技能。
ABP 框架从一开始就被设计为**与微服务兼容**。它在具有事务支持的微服务之间提供了一个用于异步通信的分布式事件总线。它还提供 C# 客户端代理来轻松调用远程服务的 REST API。
所有预构建的 ABP 应用模块都经过设计,以便您可以将它们转换为微服务。ABP 也提供了详细指南来解释如何创建微服务兼容模块。这样,您可以从模块化单体开始,然后将其转换为微服务解决方案。
ABP 团队准备了一个使用 ABP 框架构建的开源微服务参考方案。它演示了如何使用 API 网关、微服务间通信、分布式事件、分布式缓存、多个数据库提供程序和多个 UI 应用程序。它还包括在容器上运行解决方案的 Kubernetes 和 Helm 配置。详情[参阅](https://github.com/abpframework/eShopOnAbp)。
### 1.4 SaaS/多租户
**软件即服务**(**SaaS**) 是一种广泛使用的架构模式。以下是多租户系统的典型特征:
* 在租户之间共享硬件和软件资源。
* 每个租户都有用户、角色和权限。
* 在租户之间隔离数据库、缓存和其他资源。
* 可以启用/禁用每个租户的应用功能。
* 可以为每个租户自定义应用配置。
ABP 框架涵盖了所有这些要求甚至更多。它可以帮助您优雅地构建多租户系统,而您几乎感受不到多租户的存在。
我们会在\[*第 16 章*\]实现多租户,介绍如何使用 ABP 框架进行多租户应用开发。
到目前为止,我已经介绍了四种 ABP 基本架构模式。此外,ABP 还提供了启动模板来轻松创建新的解决方案。
## 2 启动模板
使用 [ASP.NET](http://ASP.NET) Core 自带的模板创建新解决方案时,只能获得单个项目,没有分层和依赖关系。您通常会花费大量时间来设置解决方案架构,包括安装工具和做配置基本。
ABP 框架提供了一个架构完善、分层清晰、预配置和生产就绪的启动解决方案模板。以下截图显示了当您运行 ABP 框架创建的启动模板时的初始 UI:
![](https://img.kancloud.cn/22/40/2240c12b840b4fa50e5f17f4ff6d69c4_1040x467.png)
下面谈谈这个启动模板:
* 解决方案已经做好逻辑分层。
* 一些预构建模块,例如**Account**和**Identity**模块。已经实现了基本的*登录*、*注册*、*用户和角色管理*以及其他一些标准功能。
* 预先配置好的 **单元测试**和**集成测试**项目。
* 一些管理数据库迁移以及使用 HTTP API实用工具。
ABP的启动模板带有**UI框架**和**数据库提供**者的多个选项。你可以从**Angular**、**Blazor**或**MVC**(**Razor Pages**) 选择一个作为 UI框架,或者使用**Entity Framework Core**或**MongoDB**作为数据库提供者。
## 3 ABP 基础设施
ABP 基于您已经了熟悉的工具和库。它没有引入新的**对象关系映射器**(**ORM**),而是使用**Entity Framework Core**。同样,它使用 Serilog、AutoMapper、IdentityServer 和 Bootstrap,而不是自己创建类似的功能。它提供了一个解决方案集成了这些工具,并实现了常见的业务应用需求。
ABP 框架按照约定**简化**了异常处理、验证、授权、缓存、审计日志和数据库事务管理,并允许您在需要时进行精细控制。
ABP 与 IdentityServer 很好地集成,基于 cookie 和令牌的身份验证以及单点登录。它还提供了一个详细的、基于权限的授权系统来帮助您控制应用的权限。
同时也提供了后台作业、BLOB 存储、文本模板、审计日志和本地化等常见组件。
在 UI 部分,ABP 提供了完整的 UI 主题系统,帮助您开发无主题的模块化应用,并轻松为应用程序安装主题。它还在 UI 方面提供了大量功能和帮助程序,以消除重复代码。
## 4 社区
当您在公司中搭建解决方案架构时,除了开发人员没有人会去研究它。然而,ABP 拥有一个庞大而活跃的社区。他们使用相同的架构和基础设施,应用类似的最佳实践,并以类似的方式开发他们的应用程序。当您遇到基础架构问题或想要获得解决业务问题的想法或建议时,这具有很大的优势。由于 ABP 开发人员正在应用相同或相似的模式,因此在另一个解决方案中也更容易理解他人的代码。
ABP 框架自 2016 年以来一直存在并不断发展。截至 2021 年底,它在 GitHub 上拥有 7,000 多颗星、220 多位贡献者、22,000 多个提交、5,700 个已关闭问题,以及在 NuGet 上超过 4,000,000 次下载,超过 110 多个专业和次要版本。我的意思是,它是一个成熟的、被接受的、值得信赖的开源项目。
来自ABP 核心团队和社区的贡献者,有着不断持续输出的文章,视频教程可供大家学习:[ABP社区网站](https://community.abp.io):
![](https://img.kancloud.cn/7f/21/7f21473ed80a2f7f5751ef5645fc7c8b_1152x929.png)
# 概括
在本章中,我们介绍了构建业务解决方案的问题,并解释了 ABP 如何为这些常见问题提供解决方案。ABP 还通过提供预构建架构解决方案和实现该架构所需的基础设施来提高开发人员的生产力。
在下一章中,您将学习如何使用 ABP 的**命令行界面**(**CLI**) 工具创建新的解决方案并在您的开发环境中运行它。
- 前言
- 第一部分
- 第1章 现代软件开发和 ABP 框架
- 企业级 Web 开发的挑战
- ABP框架的能力清单
- 第2章 ABP框架入门
- 安装 ABP CLI
- 创建新解决方案
- 运行解决方案
- 探索预构建模块
- 第3章 逐步开发开发ABP应用
- 创建解决方案
- 定义领域对象
- EFCore和数据库映射
- 定义应用服务
- 测试产品
- 产品列表
- 创建产品
- 编辑产品
- 删除产品
- 第4章 探索 EventHub解决方案
- 应用介绍
- 架构探索
- 方案运行
- 第二部分
- 第5章 探索ABP基础架构
- 了解模块化
- 使用依赖注入系统
- 配置应用程序
- 实现选项模式
- 日志系统
- 第6章 数据访问基础架构
- 定义实体
- 定义仓储库
- EF Core集成
- 了解 UoW
- 第7章 探索横切关注点
- 认证授权
- 用户验证
- 异常处理
- 第8章 体验 ABP 的功能和服务
- 获取当前用户
- 使用数据过滤
- 控制审计日志
- 缓存数据
- 本地化用户界面
- 第三部分
- 第9章 理解领域驱动设计
- 介绍 DDD
- 构建基于 DDD 的 解决方案
- 处理多个应用程序
- 了解执行流程
- DDD的通用原则
- 第10章 领域层 Domain
- 领域事件案例分析
- 聚合和实体的设计原则和实践
- 实现领域服务
- 落地存储库
- 构建规约(Specification)
- 领域事件
- 第11章 应用层 Application
- 落地应用服务
- 设计 DTO
- 理解各层的职责
- 第四部分
- 第12章 MVC/Razor 页面
- 主题系统
- 绑定和压缩
- 导航菜单
- Bootstrap标签助手
- 创建表单并验证
- 使用模态窗口
- 使用JS API
- 调用HTTP API
- 第13章 Blazor WebAssembly UI
- 什么是Blazor
- ABP Blazor UI
- 验证用户身份
- 理解主题系统
- 使用菜单
- 使用基本服务
- 使用UI服务
- 消费HTTP API
- 使用全局脚本和样式
- 第14章 HTTP API 和实时服务
- 构建HTTP API
- 使用HTTP API
- 使用SignalR
- 第五部分
- 第15章 落地模块化
- 理解模块化
- 构建支付模块
- 安装模块
- 第16章 实现多租户
- 理解多租户
- 多租户基础设施
- 使用功能系统
- 何时使用多租户
- 第17章 构建自动化测试
- 了解ABP测试基础设施
- 构建单元测试
- 构建集成测试