构建现代软件系统是一项复杂的工作,即使是创建基本的业务解决方案也会面临许多挑战,需要深入研究基础设施问题,实现标准的非业务需求,而不是实现业务代码,然而业务代码才是试图构建的软件系统中真正有价值的部分。
ABP Framework 通过提供健壮的软件架构、必要的基础设施来帮助构建现代WEB解决方案,以帮助您专注于编写业务代码,为软件系统利益相关者增加价值。它提供了端到端、一致性的开发体验,从而提高生产力。ABP Framework 可以使您和您的团队在现代软件开发中遵循最佳开发实践。
本教程是通过遵循现代软件开发方法和最佳实践,使用 ABP Framework 开发WEB应用程序的指南。
第一章介绍了构建一个良好架构的企业解决方案所面临的挑战,并解释了ABP Framework 如何应对这些挑战。
在本章中,我们将讨论以下主题:
- 开发企业级WEB解决方案的挑战
- 理解 ABP Framework 提供了什么
开发企业级WEB解决方案的挑战
在深入研究 ABP Framework 之前,先介绍一下开发现代企业WEB解决方案的挑战,以理解为什么需要像 ABP Framework 这样的应用框架。让我们从解决方案的架构开始。
架构设计
在开始编写代码之前,需要为解决方案创建一个架构,这是构建软件系统最具挑战性的阶段之一。我们面临很多选择,在此阶段所做的任何决定都可能影响应用程序的整个生命周期。
有一些常见的、众所周知的系统级别的架构模式,如单体架构、模块化架构和微服务架构等。应用何种架构将决定如何开发、部署和扩展解决方案,所以应该根据需求来决定。
除了这些系统级别的架构模式之外,还有诸如命令和查询责任分离(CQRS)、领域驱动设计(DDD)、**分层架构(Layered Architecture)和整洁架构(Clean Architecture)**等软件开发模型决定了代码库是如何形成的。
一旦决定了架构,就应该创建基本的解决方案结构,使用该架构来进行开发。在这个阶段,还需要决定使用哪种语言、框架、工具和类库。
所有这些决策都需要丰富的经验,因此它们最好由经验丰富的软件架构师来完成。然而,并非所有的团队成员都具有相同水平的知识和经验,因此还需要培训和确定正确的编码标准。
在设置了架构并创建了基本解决方案之后,开发团队就可以开始开发了。下一节将讨论每个软件解决方案中的通用、重复内容,以及如何在开发中避免重复。
不要重复自己
不要重复自己(DRY) 是软件开发关键原则之一。计算机将现实世界的重复性任务自动化,使人们的生活更轻松。那么,为什么我们在构建软件解决方案时要重复自己呢?
身份验证是每个软件解决方案中需要解决的一个非常普遍的问题:单点登录、Active Directory 集成、基于令牌的身份验证、社交登录、双重身份验证、忘记/重置密码、电子邮件激活等,这些需求中的大多数是否熟悉?几乎所有的软件项目对身份验证都有或多或少相似的要求。与其从头开始构建所有这些,不如使用现有的解决方案更好,例如第三方类库或云服务。这种预先构建的解决方案成熟且经过实战测试,相对安全。
一些非功能性需求,例如:异常处理、验证、授权、缓存、审计日志和数据库事务管理,也是项目代码重复的关注点所在,这些关注点称为横切关注点,应该在每个 Web 请求进行中处理。在架构良好的软件解决方案中,这些问题应该由在代码库中基于约定自动处理,或者提供服务以使其更易于实现。
当集成第三方系统时,例如 RabbitMQ 和 Redis,通常希望围绕与这些系统创建抽象和包装器。这样,业务逻辑就与这些基础设施组件隔离开。此外,不必在解决方案的任何地方重复相同的连接、重试、异常处理和日志记录逻辑。
拥有一个预先构建的基础架构来自动执行这些重复性工作可以节省开发时间,以便专注于处理业务逻辑。下一节将讨论在应用程序中占用开发时间的另一个主题——构建用户界面。
构建基础界面
如果应用程序的用户界面(UI),不够时尚也不易用,就算它具有出色的商业价值,也不会吸引人。虽然每个应用程序 UI 功能和设计要求各不相同,但基本结构是相同的,大多数应用程序都需要相同的基本UI元素,例如警告、按钮、卡片、表单元素、选项卡和数据表,可以使用成熟的 HTML/CSS 框架,例如 Bootstrap、Bulma 和 Ant Design,而不是为每个应用程序创建一个UI系统。
几乎每个 WEB 应用程序都有响应式布局,主菜单、工具栏、页眉和页脚、自定义主题颜色,需要为应用程序确定所有这些页面和组件实现的基本 UI 工具包,通过这种方式,UI 开发人员可以创建一致的 UI。
到这里为止,已经介绍了一些常见的基础架构需求,与具体的业务逻辑无关。下一节将讨论企业系统中的常见业务需求。
实现通用业务需求
虽然每个应用程序和系统都是独一无二的,其价值也往往来自于这种独特性,但每个系统都有一些相同的基本需求。
基于权限的授权系统是这些基本要求之一,用于在应用程序中控制用户和客户端的权限。如果想自己实现这一项功能,应该创建一个包含数据库表、授权逻辑、权限缓存、API 和 UI 页面的端到端解决方案,以将这些权限分配给用户,并在需要时进行验证。但是,这样的系统非常通用,可以开发为可重用模块并由多个应用程序使用。
与身份管理一样,许多系统需要审计日志报告、租户和订阅管理(针对 SaaS 应用程序)、本地化、文件上传和共享、多语言管理和时区管理等功能。除了这些模型行功能之外,可能还有一些低级别的要求,例如实现软删除模式和在应用程序中存储二进制大对象 (BLOB) 数据。
在企业系统开发过程中,解决这些常见的业务需求的方案之一是从头开始构建。但是,如果这些功能不是应用程序中要提供的主要价值,则可以考虑使用预构建的模块和库,并根据需求对其进行自定义。
在下一节中,将了解 ABP Framework 如何帮助我们解决本节中讨论的通用基础架构和通用业务需求。
理解 ABP Framework 提供了什么
ABP Framework 提供了一个有主见的架构,可帮助在 .NET 和 ASP.NET Core 平台之上构建具有最佳开发实践的软件解决方案。它提供了基础架构、生产就绪的模块、主题、工具和文档,帮助正确实施架构,并尽可能地自动化重复性工作。
在接下来的几个小节中,将从架构开始解释 ABP 如何完成所有这些工作。
ABP 架构
前面提到 ABP 提供了一个有主见的架构。所以,应该先解释一下什么是无主见的框架,什么是有主见的框架。
正如在架构设计部分所述,为软件解决方案准备架构需要大量决策;您应该决定在您的解决方案中使用的系统架构、开发模型、框架、工具和类库。
无主见的框架,例如 ASP.NET Core,对这些决定没有要求,由开发者决定。例如,可以通过将 UI 层与数据访问层分离来创建分层解决方案,或者可以通过直接从 UI 页面/视图访问数据库来创建单层解决方案。可以使用任何与 ASP.NET Core 兼容的类库,并且可以应用任何架构模式。无主见使 ASP.NET Core 在应对不同的场景中变得灵活。但是,它将软件架构设计所要做的这些决策交给开发者,设置正确的架构,并准备基础架构以实施该架构。
并不是说 ASP.NET Core 完全没有“主见”。它假定您正在构建基于 HTTP 规范的 Web 应用程序或 API,清楚地定义了应该如何开发 UI 和 API 层,还提供了一些底层基础设施组件,例如依赖注入、缓存和日志记录。实际上,这些组件可用于任何 .NET 应用程序,而不是特定于 ASP.NET Core,并没有要求您如何形成业务代码以及使用那种架构模式。
另一方面,ABP Framework 是一个有主见的框架,在解决方案中对使用的架构、模式、工具和类库提供建议。 尽管 ABP Framework 足够灵活,可以使用不同的工具和类库,并改变你的架构决策,但当你遵循它的建议时,会获得最大价值。别担心,它为通用架构提供了良好的、行业认可的解决方案,以帮助您使用最佳实践构建可维护的软件解决方案。这将节省您的时间,提高您的生产力,并使您专注于编写业务代码而不是解决基础设施问题。
在接下来的几节中,将介绍 ABP 所支持的四种基本架构。
领域驱动设计
ABP Framework 主要目标之一是提供基于 DDD 模式和实践的分层架构,提供了一个分层架构的启动模板和必要的基础设施以及正确应用该架构的帮助文档。
在本教程第3部分 实施领域驱动设计,专门解释了使用 ABP Framework 构建基于 DDD 解决方案的最佳实践。
模块化
软件开发中,模块化是一种用于将系统拆分为独立部分(称为模块)的技术。 最终目标是降低复杂性,提高可重用性,并使不同的团队能够并行处理不同的功能集,而不会相互影响。
模块化有两个主要的挑战,可以用 ABP Framework 来简化:
第一个挑战是隔离模块,ASP.NET Core 有一些特性,例如 Razor 组件库,支持模块化应用程序。 尽管如此,功能仍然非常有限,因为它是一个无主见的框架,并且仅对 UI 和 API 部分有主见。 另一方面,ABP Framework 提供了一个一致的模型和基础设施来构建完全隔离、可重用的应用模块,应用模块包含其数据库、领域、应用程序和 UI 层。
模块化的第二个挑战是如何将这些独立模块在运行时组合为一个统一的应用程序。 ABP Framework 为模块化系统的常见需求提供了具体的模型,例如在模块之间共享数据库,通过事件或 API 调用在模块之间进行通信,以及在应用程序中安装模块。
ABP Framework 提供了许多可用于任何应用程序的预构建开源应用模块,例如:提供用户、角色和权限管理的 Identity 模块,以及为应用程序提供登录和注册页面的 Account 模块。重用和自定义这些模块可以节省您的开发时间。此外,ABP 提供了一个应用模块启动模板来帮助快速构建可重用的应用模块。在本教程 第15章 模块化 会详细介绍。
模块化既可以帮助管理大型单体系统的复杂性,也可以帮助创建微服务解决方案。
微服务
微服务和分布式架构是构建可扩展软件系统方法之一,允许不同团队处理不同的服务,并独立地对服务进行发布、部署和扩展。然而,构建微服务系统在开发、部署、微服务间通信、数据一致性、监控等方面存在一些重要挑战。
微服务系统是一种将许多不同学科、方法、技术和工具结合在一起来解决问题的解决方案。每个微服务系统都有其要求和限制。每个团队都有一定程度的专业知识、知识和技能。
ABP Framework 从一开始就被设计为与微服务兼容。例如:它为具有事务支持的微服务之间的异步通信提供了一个分布式事件总线,在 第10章 DDD:领域层 中 发布领域事件 部分所述;它还提供 C# 客户端代理,以轻松使用远程服务的 REST API ,在 第14章 构建 HTTP API 和实时服务 中 使用 HTTP API 部分所述。
所有 ABP Framework 中预构建的 应用模块都经过精心设计的,以便可以方便地将它们转换为微服务。ABP Framework 还提供了详细的帮助文档来解释如何创建与微服务兼容的应用模块。这样,可以从模块化单体架构开始,然后将其转换为微服务架构的解决方案。
ABP 开发团队准备了一个使用 ABP Framework 构建的开源微服务示例解决方案 eShopOnAbp 。演示了如何使用 API 网关、微服务间通信、分布式事件、分布式缓存、多数据库提供程序、多应用程序、单点登录等技术创建的解决方案。它还包括用于在容器上运行解决方案的 Kubernetes 和 Helm 配置。
下一节将介绍 ABP Framework 提供的最后一个开箱即用的基本架构——多租户。
多租户/SAAS
软件即服务 (SaaS) 是一种常用的销售软件产品的流行方法。多租户是一种广泛使用的构建 SaaS 系统的架构模式。以下是多租户系统的典型特征:
- 在租户之间共享硬件和软件资源。
- 每个租户都有用户、角色和权限。
- 在租户之间隔离数据库、缓存和其他资源。
- 可以启用/禁用每个租户的应用程序功能。
- 可以为每个租户定制应用程序配置。
ABP Framework 提供涵盖了所有这些要求的基础设施,可以帮助您构建多租户系统。在 第16章 实现多租户,解释了使用 ABP Framework 进行多租户应用程序开发。
到目前为止,我已经介绍了 ABP Framework 作为预构建解决方案提供的基本架构模式。但是,ABP Framework 还提供了启动模板来帮助您轻松创建新的解决方案。
启动模板
当使用 ASP.NET Core 标准启动模板创建新解决方案时,将获得一个具有最少依赖项且没有分层的单项目解决方案,这不是生产就绪的。通常需要花费大量时间来设置解决方案结构,以正确实施您的软件架构,以及安装和配置基本工具和类库。
ABP Framework 提供了一个架构完善、分层、预配置和生产就绪的启动解决方案模板。以下屏幕截图显示了直接运行使用 ABP Framework 启动模板的初始 UI:
让我们详细地谈谈这个启动模板:
- 解决方案是分层的,清楚并告诉您如何组织代码库。
- 一些预先构建的模块已经安装,例如:Account 和Identity 模块,已经实现了登录、注册、用户和角色管理以及其他一些标准功能。
- 单元测试和集成测试项目已预先配置,可以编写您的第一个测试代码。
- 包含一些实用应用程序来管理数据库迁移以及使用和测试 HTTP API。
ABP Framework 应用程序启动模板为 UI 框架和数据库提供程序提供了多个选项,可以选择 Angular、Blazor 或 MVC(Razor Pages)作为 UI 框架,并使用 Entity Framework Core 或 MongoDB 作为数据库提供程序。将在 第2章 开始使用 ABP Framework 中学习如何创建新解决方案并运行它。
在下一节中,将介绍 ABP Framework 基础设施组件。
ABP Framework 基础设施
ABP Framework 基础设置包含众多内容,是一个全栈应用程序框架,通常使用或整合成熟的开源工具和类库。例如:没有自己创建对象关系映射框架 (ORM),而是使用 Entity Framework Core。同样,使用 Serilog、AutoMapper、IdentityServer 和 Bootstrap,而不是自己创建类似的功能。提供了一个集成这些工具的解决方案,并实现了常见的业务应用程序需求。
ABP Framework 简化了异常处理、验证、授权、缓存、审计日志和数据库事务管理,按照约定自动化处理,并允许在需要时进行设置。因此,不要为这些常见的问题重复开发。
ABP Framework 与 IdentityServer 很好地集成,用于基于 Cookie 和令牌(Token)的身份验证以及单点登录。还提供了一个详细的、基于权限的授权系统来帮助控制应用程序的用户和客户端的权限。
在基础设施中,还为后台作业、BLOB 存储、文本模板、审计日志和本地化组件等常见业务需求提供内置解决方案。
在 UI 部分,ABP Framework 提供了完整的 UI 主题系统,帮助开发无主题的模块化应用程序,并轻松为应用程序安装主题。它还在 UI 端提供了大量功能和帮助程序,以消除重复代码并提高生产力。
下一节将讨论社区,这对于开源项目很重要。
社区
当您在公司中设计解决方案架构时,除了开发人员之外,可能没有人知道。然而,ABP 拥有一个庞大而活跃的社区。他们使用相同的架构和基础设施,应用类似的最佳实践,并以类似的方式开发他们的应用程序。当您遇到基础架构问题或想要获得实施业务问题的想法或建议时,这具有很大的优势。 由于 ABP 开发人员正在应用相同或相似的模式,因此在另一个解决方案中也更容易理解某人的代码。
ABP Framework 自 2016 年以来一直存在并不断发展。截至 2021 年底,它在 GitHub 上拥有 7000 多个 star、220 多个贡献者、22,000 多个提交、5700 个已关闭问题以及在 NuGet 上的超过 4,000,000 次下载,超过 110 多个主要和次要版本。是一个成熟的、被广泛应用的、值得信赖的开源项目。
查看 ABP社区网站,了解其他人正在使用 ABP 框架做什么,并密切关注 ABP 框架的发展。
小结
在本章中,介绍了构建业务解决方案的问题,并解释了 ABP Framework 如何为这些常见问题提供解决方案。 ABP Framework 还通过提供预构建的架构解决方案和实现该架构所需的基础设施来提高开发人员的生产力。
读完本书,您将熟悉 ABP Framework,并学习到很多有关企业级软件开发的最佳实践和技术。
在下一章中,您将学习如何使用 ABP 命令行工具 (CLI) 创建新的解决方案,并在开发环境中运行它。