ABP vNext 框架系列第1篇:企业级 .NET 开发,别再从头造轮子了

发布时间:2026/8/24 16:18:05
ABP vNext 框架系列第1篇:企业级 .NET 开发,别再从头造轮子了 大家好我是刚子。今天咱们聊聊 ABP vNext。大部分企业级项目ERP、CRM、OA、电商后台都有着相似的底层需求用户登录 权限控制永远有一套。你得写角色、写权限、写菜单。审计日志谁在什么时候操作了什么得有。多租户同一个系统服务多个客户数据还不能混得有。数据访问写实体、写仓储、写增删改查得有。定时任务每天凌晨跑个报表、发个通知得有。这些功能需求——认证授权、审计日志、多租户支持、缓存、本地化、异常处理——在 ABP 里面全部内置好了框架自带的功能模块你拿来就能用。说白了ABP就是帮你把企业级应用里“重复的那60%”全都搞定你只需要往上摞业务逻辑就行了。一、为什么你需要 ABP大部分企业级项目ERP、CRM、OA、电商后台都有着相似的底层需求用户登录 权限控制永远有一套。你得写角色、写权限、写菜单。审计日志谁在什么时候操作了什么得有。多租户同一个系统服务多个客户数据还不能混得有。数据访问写实体、写仓储、写增删改查得有。定时任务每天凌晨跑个报表、发个通知得有。这些功能需求——认证授权、审计日志、多租户支持、缓存、本地化、异常处理——在 ABP 里面全部内置好了框架自带的功能模块你拿来就能用。说白了ABP就是帮你把企业级应用里“重复的那60%”全都搞定你只需要往上摞业务逻辑就行了。二、ABP vNext 是什么ABP vNext全称ASP.NET Boilerplate Next是一个基于 ASP.NET Core 的开源企业级应用框架由土耳其开发者Volkan Ceylan主导开发。这个项目最早是2013年左右在社区里开始做的。为什么要做它老ABPASP.NET Boilerplate跑在.NET Framework上很多技术已经被时代淘汰了。于是作者干脆把底层推到.NET Core技术栈上重新设计和实现这就有了现在的ABP vNext。ABP vNext不是一个简单的NuGet包而是一整套解决方案——从底层架构到顶层应用模块从代码生成工具到文档体系都有了。三、ABP 的核心功能能帮你省掉哪些事刚子给你列一个最核心的功能清单模块化开发应用程序拆成独立的功能模块用户模块、订单模块、支付模块每个模块可以独立开发、独立部署、甚至复用。团队可以并行开发互不干扰。领域驱动设计DDD支持原生支持多变的复杂业务场景内置实体、值对象、聚合根、仓储、领域服务等DDD核心概念。开箱即用的认证授权用户登录、角色权限、策略控制、JWT、OAuth2一键集成。多租户一行配置开启多租户支持同一个系统服务多个客户数据自动隔离。可共享数据库也可独立数据库灵活可控。审计日志自动记录“谁在什么时候改了什么东西”无需手写任何代码。数据访问全覆盖默认支持 EF Core 和 MongoDB内置通用仓储模式IRepositoryTEntity, TKeyCRUD代码量大幅减少。统一异常处理框架提供全局异常过滤器自动返回标准化响应如ProblemDetails不用再重复写try-catch了。有同行做过测算这些基础设施类功能加起来通常要占掉一个项目大约60%的开发周期。ABP把这些全部内置好了。你接手一个新项目第一天不用搭架构、配权限、写审计日志直接动手写业务代码就行了。四、ABP 的架构是怎样的很多新手刚接触ABP时被一堆分层概念“领域层、应用层、基础设施层、表现层”搞晕了。刚子用图书商城这个大家熟悉的场景讲清楚这四层在干嘛领域层Domain放“核心业务规则”。比如“库存数量不能为负数”这个规则就放在领域层。定义Book实体、BookManager领域服务确保业务逻辑不会散落到各处。应用层Application写“应用服务”编排业务流程但不包含核心业务规则。比如“创建图书同步库存”的流程放在BookAppService里。它调用领域层完成具体操作但不参与库存不能为负的判断。基础设施层Infrastructure管技术实现。比如用EF Core实现IBookRepository接口跟数据库打交道上层不关心用的是SQL Server还是MySQL。表现层Presentation用户能看到的界面或API端点。比如BookController提供“查询图书”“新增图书”的HTTP接口。目录结构也是按这个分好层了的MyProject.Domain存放实体对象和领域逻辑。MyProject.Application存放应用服务业务接口。MyProject.EntityFrameworkCore数据访问实现。MyProject.HttpApi.HostWeb API 启动项目。ABP已经帮你划好了这四层的目录结构和依赖关系你只需按对应的层写代码即可。五、5分钟跑起第一个ABP项目心动不如行动直接上手跑一个。你需要在电脑上安装好以下工具.NET SDK 6.0核心运行环境命令行执行dotnet --version检查一下。Node.js前端依赖推荐LTS版本。数据库SQL Server / MySQL / PostgreSQL 任选一个。刚子示例用SQL Server。IDEVisual Studio 2022 或 JetBrains Rider 都可以。Step 1安装 ABP CLI在命令行粘贴以下代码按回车执行bashdotnet tool install -g Volo.Abp.Cli安装完成后验证一下版本bashabp --version显示类似ABP CLI 9.x.x的结果说明安装成功。Step 2创建项目用ABP CLI创建名为“book-store”的应用程序项目bashabp new book-store -t app-t app表示生成「前后端分离模式」的应用程序模板后端基于ASP.NET Core Web API前端默认是Angular。当然你也可以换成-t module生成独立模块或者选-t mvc生成包含MVC界面的项目。执行成功后项目结构大概是这样的bashbook-store/ ├── aspnet-core/ # 后端 C# 项目 │ ├── src/ # 源代码 │ │ ├── book-store.Domain # 实体领域逻辑 │ │ ├── book-store.Application # 应用服务 │ │ ├── book-store.EntityFrameworkCore # EF Core 数据访问 │ │ ├── book-store.HttpApi # API 接口定义 │ │ └── book-store.HttpApi.Host # Web API 启动项目 │ └── test/ # 单元测试项目 ├── angular/ # 前端 Angular 项目 └── vue/ # 前端 Vue 项目如果选了VueStep 3配置数据库连接找到aspnet-core/src/book-store.HttpApi.Host/appsettings.json文件修改ConnectionStrings节点内的Default连接字符串为实际地址。jsonConnectionStrings: { Default: Server127.0.0.1;DatabaseBookStoreDb;User Idsa;Password你的密码; }Step 4初始化数据库在aspnet-core/src/book-store.HttpApi.Host目录下执行以下命令bashdotnet ef database updateABP会自动创建所有需要的数据库表用户表、角色表、权限表、租户表、审计日志表、设置表等开发者不需要手动建表。Step 5启动后端在同一个HttpApi.Host目录下执行bashdotnet run默认监听https://localhost:44367或类似端口。用浏览器访问https://localhost:44367/swagger看到Swagger文档页面说明API服务已经启动成功了。Step 6启动前端可选如果要体验完整的带前端页面的系统可以启动前端项目bashcd angular # 或 vue npm install npm run serve默认账号为 admin / 1q2w3E*登录后可以看到一个功能完备的后台管理模板用户管理、角色管理、菜单管理、审计日志等界面都有了。六、添加第一个业务模块图书管理下面通过一个图书管理模块的实例完整走一遍ABC的四个步骤实体→仓储→应用服务→API端点。在 Domain 层定义实体csharpusing System; using Volo.Abp.Domain.Entities.Auditing; namespace book_store.Books { // 继承 AuditedAggregateRoot 自动带上创建人/修改人/创建时间/修改时间 public class Book : AuditedAggregateRootGuid { public string Name { get; set; } public string Author { get; set; } public decimal Price { get; set; } public int Stock { get; set; } } }继承AuditedAggregateRootGuid最大的好处就是不用自己写CreatedAt、CreatorId、LastModifiedAt这些审计字段了ABP会自动帮你处理。在 Infrastructure 添加 DbContext 映射csharpusing Microsoft.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.Modeling; using book_store.Books; namespace book_store.EntityFrameworkCore { public static class BookStoreDbContextModelCreatingExtensions { public static void ConfigureBook(this ModelBuilder builder) { builder.EntityBook(b { b.ToTable(AppBooks); b.ConfigureByConvention(); // 按ABP规范配置软删除、审计等 b.Property(x x.Name).IsRequired().HasMaxLength(128); b.Property(x x.Author).HasMaxLength(64); b.Property(x x.Price).HasColumnType(decimal(18,2)); }); } } }在 Application.Contracts 创建 DTO 和接口这一步在项目创建时可选框架通常已生成模板按实际需要调整即可csharpusing System; using Volo.Abp.Application.Dtos; namespace book_store.Books { public class BookDto : AuditedEntityDtoGuid { public string Name { get; set; } public string Author { get; set; } public decimal Price { get; set; } public int Stock { get; set; } } }csharpusing System; using System.Threading.Tasks; using Volo.Abp.Application.Services; namespace book_store.Books { public interface IBookAppService : ICrudAppServiceBookDto, Guid { Task DecreaseStockAsync(Guid id, int quantity); } }在 Application 层实现应用服务ABP提供的CrudAppService基类已经包含了GetListAsync、CreateAsync、UpdateAsync、DeleteAsync这五个基础的CRUD方法。大部分业务场景下刚子建议优先继承CrudAppService直接复用框架生成的代码不要重复写。csharpusing System; using System.Threading.Tasks; using Volo.Abp.Application.Services; namespace book_store.Books { public class BookAppService : CrudAppServiceBook, BookDto, Guid, PagedAndSortedResultRequestDto, IBookAppService { public BookAppService(IRepositoryBook, Guid repository) : base(repository) { } public async Task DecreaseStockAsync(Guid id, int quantity) { var book await Repository.GetAsync(id); if (book.Stock quantity) { throw new Exception(库存不足); } book.Stock - quantity; await Repository.UpdateAsync(book); } } }几行代码Create、Update、Delete、GetList、Get这五个标准API就全都有了。加了一个DecreaseStockAsync做扣库存业务——这个Repository就是框架内置的通用仓储基类提供标准的增删改查方法不用手写Insert、Update、Delete这些基础SQL代码了。暴露 API 端点在 HttpApi 项目中添加控制器。但实际上ABP对应用服务有自动API约定——只要继承CrudAppService之类的基类或者类名以AppService结尾框架会自动把它暴露成HTTP端点路径默认是/api/app/book。刚子大白话在实际项目中Book换成你的业务实体名称CreateUpdateBookDto对应了前端传过来的数据结构代码生成器ABP Suite帮你生成这些模板后你只需要修改几个字段名和业务约束条件API就出来了。不需要手写Controller、Service、Repository三层代码。小结ABP vNext不是“银弹”也没法帮你写代码。但它的定位很清楚帮你跳过企业级开发里那60%重复的基础设施工作让你专注业务本身。下次写一个新项目身份认证别手写多租户别手写审计日志别手写。刚子已经把ABP怎么发车、怎么搭路、最核心的两个场景Swagger→数据库映射、加Book实体走全流程都演示完了。剩下的看文档照着Roadmap走就行了。如果你觉得这篇有用点个赞、转给还在从头堆代码的兄弟。我是刚子一个还在写.NET的老程序员。咱们下篇见