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