企业级软件开发和ABP 框架
导语
在开始文章之前,我给大家举一个发生在我身边的例子。我们交付的软件是面向企业的一锤子买卖,后期可能会存在个别定制化。前期我们直接按项目来走,因为我们也不知道未来的业务长什么样子,只是知道大概的范围。随着项目的增长,我们团队成员直接复制一份代码,然后修修改改就适配了一个新项目,因为认为这么做最快,因为是一次性买卖啊。所以,大家也懒得打磨,就这么交付了。大家可以脑补一下,后面会出现什么问题?具体答案在文末会有一个揭晓。
在深入挖掘ABP 框架之前,我想先介绍开发现代企业 Web 解决方案的挑战,以了解为什么我们需要ABP 框架。让我们从架构开始:
架构搭建的挑战
选型挑战
在开始编码之前,我们需要为解决方案创建一个适合当前和未来一段时期的架构基础。这是构建软件系统最具挑战性的阶段,在此阶段做出的任何决定都可能会影响应用程序的整个生命周期。
有一些常见的、知名的、系统级的架构模式,例如单体架构、模块化架构和微服务架构。不同的架构选型会决定后续的团队组织架构、部署和扩展,所以我们要根据需求尽量做最优的选型。
另外,软件开发模型,例如:命令和查询职责分离(CQRS)、领域驱动设计(DDD)、分层架构和清洁架构将决定您的基础代码结构。
在这个阶段,我们还需要决定将使用哪种语言、框架、工具和库。
所有这些决策都不是一件容易的事情。
我们思考一下:我们团队的软件架构师和开发人员具备以上这些能力和经营了吗?
现实是并非所有团队成员都具有丰富的经验和知识水平。我们需要从战略上制定标准规范,在战术上实践最佳编码。
重复造轮子
不要重复自己(DRY) 是软件开发的关键原则。
我们先思考一个问题:为什么我们在构建软件时会重复自己呢?
身份验证是每个软件都需要的功能,包括单点登录、基于令牌的身份验证、社交登录、双因素身份验证、忘记/重置密码、电子邮件激活等等,几乎所有的软件项目或多或少都有相似的身份验证需求。与其从头开始构建所有这些,不如复用现有的解决方案(例如云服务)更好,不管在实战还是安全方面都更加稳定成熟。
还有一些非功能性需求,例如异常处理、验证、授权、缓存、审计日志和数据库事务管理,是代码重复源头。这些关注点被称为横切关注点,应该在每个 Web 请求中处理。
当您集成到第三方系统(例如 RabbitMQ 和 Redis)时,您通常会创建抽象和装饰器。通过这种方式,您的业务逻辑与这些基础设施组件隔离开来。此外,您不会在系统中到处重复相同的连接、重试、异常处理和日志记录逻辑。
拥有一个预先构建的基础架构来自动执行这些重复性工作可以节省您的开发时间,以便您可以专注于您的业务逻辑。
UI 设计和选型
用户界面(UI)也是应用的基础。一个过时且无法使用的 UI 不会那么吸引人,即使它在幕后具有出色的商业价值。
虽然每个应用的 UI 功能和要求各不相同,但一些基本结构是常见的,例如警报、按钮、卡片、表单元素、选项卡和数据表。您可以使用 HTML/CSS 框架,例如 Bootstrap、Bulma 和 Ant Design,而不是为每个应用程序创建一个设计系统。
几乎每个 Web 应用程序都有响应式布局,主菜单、工具栏、页眉和页脚、自定义颜色等。您将需要为应用的页面和组件实现基本 UI 工具包。这样,UI 开发人员可以创建一致的 UI。
到目前为止,我们介绍了一些常见的基础架构需求,它们大多独立于任何业务应用。下面讨论常见的业务需求。
实现常见的业务需求
虽然每个应用系统是独特的,而且其价值来自于独特性,但是每个企业系统都有一些基本的配套需求。
基于权限的授权系统是这些基本要求之一。它用于控制应用的用户和客户端的权限。如果您想自己实现这一点,您应该创建一个包含数据库表、授权逻辑、权限缓存、API 和 UI 页面的端到端解决方案。但是,这样的系统非常通用,完全可以开发为可重用模块,由多个应用共同使用。
另外,许多系统需要审计日志报告、租户和订阅管理(针对 SaaS 应用)、语言管理、文件上传和共享、多语言管理和时区管理等功能。除了预先构建的应用功能之外,可能还有低级要求,例如实现软删除模式和在应用程序中存储二进制大对象(BLOB) 数据。
所有这些常见的需求都可以从头开始构建,但是这需要我们耗费巨大的成本和精力,如果你的团队没有经验丰富的架构团队,还不一定能完成得很好。如果这些功能不是公司的主要价值,我们完全可以考虑开源社区预构建的模块和库,并根据特定的要求进行定制。
ABP 框架的能力清单
ABP 架构
领域驱动设计
模块化
-
第一个挑战是模块隔离。尽管ASP.NET Core 有一些特性(例如 Razor 组件库)来支持模块化。但是,它仍然非常有限,因为它是一个底层通用的框架,并且仅对 UI 和 API 部分支持。另一方面,ABP 框架提供了一个一致的模型和基础设施来构建完全隔离的、可重用的应用模块及数据库、领域、应用和 UI 层。
-
第二个挑战是模块之间如何通信,使之成为一个统一的应用程序。ABP 为模块化系统提供常见的模型,例如在模块之间共享数据库,在模块之间通过事件或 API 进行通信,以及模块安装。
模块化非常适合管理复杂的大型单体系统。但是,ABP 也可以帮助您创建微服务解决方案。
微服务
所有预构建的 ABP 应用模块都经过设计,以便您可以将它们转换为微服务。ABP 也提供了详细指南来解释如何创建微服务兼容模块。这样,您可以从模块化单体开始,然后将其转换为微服务解决方案。
SaaS/多租户
-
在租户之间共享硬件和软件资源。
-
每个租户都有用户、角色和权限。
-
在租户之间隔离数据库、缓存和其他资源。
-
可以启用/禁用每个租户的应用功能。
-
可以为每个租户自定义应用配置。
我们会在[第 16 章]实现多租户,介绍如何使用 ABP 框架进行多租户应用开发。
启动模板

下面谈谈这个启动模板:
-
解决方案已经做好逻辑分层。
-
一些预构建模块,例如Account和Identity模块。已经实现了基本的登录、注册、用户和角色管理以及其他一些标准功能。
-
预先配置好的 单元测试和集成测试项目。
-
一些管理数据库迁移以及使用 HTTP API实用工具。
ABP 基础设施
社区

概括
最后,我们回答一下开头的那个问题,就是项目增长后出现的问题:代码库版本增多了。因为你不想通过一份代码在内部做if和else的不同项目判断,所以你宁愿拷贝一份可能是几百兆的项目代码,所以第二个问题就是代码急剧膨胀,占用大量的代码库空间。管理起来十分困难。归根结底,这一切是可以避免的,ABP给我们一个很好的启发。不知道读者君有没有自己的思路,欢迎留言。
(^_^)打个赏喝个咖啡(^_^)

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· DeepSeek本地性能调优
· autohue.js:让你的图片和背景融为一体,绝了!