ABP vNext Nuget 包的介绍
ABP Framework(尤其是 ABP vNext)的官方 NuGet 包以 Volo.Abp.XXX 命名,覆盖了框架核心功能、模块、集成组件等多个层面。这些包按功能可分为核心基础设施、应用层组件、数据访问、身份认证与授权、UI 集成、第三方集成等类别。以下是主要官方包的作用说明:
一、核心基础设施包
这些包是 ABP 框架的基础,提供模块化、依赖注入、配置等核心能力,几乎所有 ABP 应用都会依赖。
- Volo.Abp.Core
- ABP 框架的核心包,包含模块系统(
AbpModule)、依赖注入(IServiceCollection扩展)、对象映射(IObjectMapper)、配置系统(IConfiguration集成)、生命周期管理等基础功能。 - 所有其他 ABP 包的基础依赖。
- ABP 框架的核心包,包含模块系统(
- Volo.Abp.Modularity
- 单独封装 ABP 的模块化系统,定义模块加载、依赖管理、初始化 / 销毁流程的核心接口(如
IModuleDescriptor、IModuleManager)。 - 通常由
Volo.Abp.Core间接引用,无需单独安装。
- 单独封装 ABP 的模块化系统,定义模块加载、依赖管理、初始化 / 销毁流程的核心接口(如
- Volo.Abp.Threading
- 提供线程安全工具类(如
AsyncHelper处理同步 / 异步转换)、并发锁(ILock)、分布式锁(IDistributedLock)等线程相关功能。
- 提供线程安全工具类(如
- Volo.Abp.Json
- 封装 JSON 序列化 / 反序列化功能,基于
System.Text.Json或Newtonsoft.Json扩展,支持 ABP 自定义类型(如CultureInfo、IPAddress)的序列化。
- 封装 JSON 序列化 / 反序列化功能,基于
- Volo.Abp.Settings
- 提供应用级设置(Settings)管理功能,支持从数据库、配置文件等多源读取设置,以及设置的缓存、验证和权限控制。
- Volo.Abp.Localization
- 本地化(多语言)核心包,支持资源文件(JSON/XML)、数据库存储本地化文本,提供
ILocalizationManager等接口简化多语言开发。
- 本地化(多语言)核心包,支持资源文件(JSON/XML)、数据库存储本地化文本,提供
- Volo.Abp.Exceptions
- 定义 ABP 标准异常类型(如
UserFriendlyException、BusinessException),以及异常处理管道,支持自动转换异常为 API 友好的错误响应。
- 定义 ABP 标准异常类型(如
二、应用层组件
用于构建应用服务(Application Service)、领域层(Domain)、数据传输对象(DTO)等核心业务逻辑层。
- Volo.Abp.Ddd.Application
- 领域驱动设计(DDD)中应用层的核心包,提供
IApplicationService接口、DTO 验证([ValidateModel])、工作单元(IUnitOfWork)集成等。 - 依赖
Volo.Abp.Ddd.Domain和Volo.Abp.ObjectMapping。
- 领域驱动设计(DDD)中应用层的核心包,提供
- Volo.Abp.Ddd.Domain
- DDD 领域层核心包,包含实体(
Entity)、值对象(ValueObject)、聚合根(AggregateRoot)、领域事件(IDomainEvent)、仓储(IRepository)等基础类型。
- DDD 领域层核心包,包含实体(
- Volo.Abp.ObjectMapping
- 对象映射抽象层,支持与 AutoMapper 等映射库集成,提供
IObjectMapper接口统一映射 API,简化 DTO 与实体的转换。
- 对象映射抽象层,支持与 AutoMapper 等映射库集成,提供
- Volo.Abp.Validation
- 封装数据验证功能,基于
DataAnnotations和FluentValidation扩展,支持自定义验证器和全局验证管道。
- 封装数据验证功能,基于
- Volo.Abp.Uow
- 工作单元(Unit of Work)核心包,管理数据库事务的创建、提交、回滚,支持多数据库事务协调,默认集成 EF Core 和 MongoDB。
三、数据访问包
提供与各类数据库的集成,封装仓储(Repository)接口和实现。
- Volo.Abp.EntityFrameworkCore
- 集成 Entity Framework Core(EF Core)的核心包,提供
EfCoreRepository实现,支持 EF Core 的数据库上下文(DbContext)与 ABP 模块系统结合。
- 集成 Entity Framework Core(EF Core)的核心包,提供
- Volo.Abp.EntityFrameworkCore.SqlServer
- 针对 SQL Server 数据库的 EF Core 集成包,包含特定配置(如连接字符串处理、迁移工具)。
- 类似包:
Volo.Abp.EntityFrameworkCore.MySQL、Volo.Abp.EntityFrameworkCore.PostgreSql等(对应不同数据库)。
- Volo.Abp.MongoDB
- 集成 MongoDB 的核心包,提供
MongoRepository实现,支持 MongoDB 集合与 ABP 仓储接口的适配。
- 集成 MongoDB 的核心包,提供
- Volo.Abp.Dapper
- 集成 Dapper 微型 ORM 的包,提供
DapperRepository实现,支持原生 SQL 查询,可与 EF Core 共存。
- 集成 Dapper 微型 ORM 的包,提供
四、身份认证与授权
处理用户认证、权限管理、角色控制等安全相关功能。
- Volo.Abp.Identity.Core
- 身份认证核心包,基于 ASP.NET Core Identity 扩展,提供用户(
IdentityUser)、角色(IdentityRole)管理的领域层和应用层接口。
- 身份认证核心包,基于 ASP.NET Core Identity 扩展,提供用户(
- Volo.Abp.Identity.HttpApi
- 身份认证模块的 HTTP API 包,暴露用户 / 角色管理的 API 接口(如
/api/identity/users),供前端调用。
- 身份认证模块的 HTTP API 包,暴露用户 / 角色管理的 API 接口(如
- Volo.Abp.PermissionManagement
- 权限管理核心包,定义权限(
Permission)模型、权限检查器(IPermissionChecker),支持从数据库动态管理权限。
- 权限管理核心包,定义权限(
- Volo.Abp.Authorization
- 授权体系核心包,基于 ASP.NET Core Authorization 扩展,提供
[Authorize]特性的增强,支持 ABP 权限与角色的集成。
- 授权体系核心包,基于 ASP.NET Core Authorization 扩展,提供
- Volo.Abp.TenantManagement
- 多租户(Multi-Tenancy)核心包,提供租户(
Tenant)管理、租户隔离(如数据库隔离)、租户分辨率(ITenantResolver)等功能。
- 多租户(Multi-Tenancy)核心包,提供租户(
五、UI 集成包
针对不同 UI 框架(如 MVC、Blazor、Angular)的集成支持。
- Volo.Abp.AspNetCore.Mvc
- 集成 ASP.NET Core MVC 的核心包,提供 MVC 控制器基类(
AbpController)、视图本地化、路由扩展、API 版本控制等功能。
- 集成 ASP.NET Core MVC 的核心包,提供 MVC 控制器基类(
- Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared
- ABP 主题系统的共享包,包含布局组件、样式基础、资源管理(CSS/JS)等,是所有 ABP 主题(如 LeptonX)的基础。
- Volo.Abp.AspNetCore.Components
- 集成 ASP.NET Core Blazor(Server/WASM)的核心包,提供 Blazor 组件基类(
AbpComponentBase)、本地化、依赖注入适配等。
- 集成 ASP.NET Core Blazor(Server/WASM)的核心包,提供 Blazor 组件基类(
- Volo.Abp.AspNetCore.Mvc.UI.Bootstrap
- 集成 Bootstrap 样式库的包,提供 Bootstrap 组件的 Tag Helper(如
abp-button)和样式适配。
- 集成 Bootstrap 样式库的包,提供 Bootstrap 组件的 Tag Helper(如
六、第三方集成包
集成主流第三方服务或工具。
- Volo.Abp.Caching
- 缓存核心包,基于
IDistributedCache扩展,支持内存缓存、Redis 缓存,提供缓存键管理、缓存失效策略。
- 缓存核心包,基于
- Volo.Abp.Redis
- 集成 Redis 的包,提供 Redis 分布式缓存、分布式锁的实现,依赖
StackExchange.Redis。
- 集成 Redis 的包,提供 Redis 分布式缓存、分布式锁的实现,依赖
- Volo.Abp.Emailing
- 邮件发送核心包,封装邮件服务(
IEmailSender),支持 SMTP 配置,可集成 SendGrid 等第三方邮件服务。
- 邮件发送核心包,封装邮件服务(
- Volo.Abp.BackgroundJobs
- 后台任务调度核心包,支持延迟任务、重试机制,可与 Hangfire、Quartz 等调度框架集成(需配合
Volo.Abp.BackgroundJobs.Hangfire等包)。
- 后台任务调度核心包,支持延迟任务、重试机制,可与 Hangfire、Quartz 等调度框架集成(需配合
- Volo.Abp.Swashbuckle
- 集成 Swashbuckle(Swagger)的包,自动配置 API 文档,支持 ABP 模块的 API 分组、权限说明等。
七、其他常用包
- Volo.Abp.Auditing
- 审计日志核心包,记录实体创建 / 修改信息(如
CreationTime、LastModifierUserId)、API 调用日志等。
- 审计日志核心包,记录实体创建 / 修改信息(如
- Volo.Abp.Features
- 功能模块(Features)管理包,支持基于租户 / 用户启用 / 禁用功能(如 “付费功能” 开关),提供
[RequiresFeature]特性。
- 功能模块(Features)管理包,支持基于租户 / 用户启用 / 禁用功能(如 “付费功能” 开关),提供
- Volo.Abp.EventBus
- 事件总线核心包,支持进程内事件(
ILocalEventBus)和分布式事件(IDistributedEventBus),解耦模块间通信。
- 事件总线核心包,支持进程内事件(
- Volo.Abp.MultiTenancy
- 多租户基础包,定义租户接口(
ITenant)、租户存储(ITenantStore),支持无租户、单租户、多租户模式切换。
- 多租户基础包,定义租户接口(
AbpModule 模块化
一个 .csproj 应用程序可以有多个模块,但有一些重要的细节需要注意:
模块数量和类型
1. 一个启动模块(必须)
每个 ABP 应用程序必须有一个作为入口点的启动模块:
csharp// 在 Program.cs 中指定启动模块
builder.Services.AddApplication<YourStartupModule>();
2. 多个依赖模块(可选)
启动模块可以依赖多个其他模块:
csharp[DependsOn(typeof(AbpAspNetCoreMvcModule),typeof(AbpAutoMapperModule),typeof(YourDomainModule),typeof(YourApplicationModule),typeof(YourEntityFrameworkCoreModule)
)]
public class YourStartupModule : AbpModule
{// ...
}
实际示例
典型的分层模块结构:
csharp// 领域层模块
public class MyProjectDomainModule : AbpModule { }// 应用层模块
public class MyProjectApplicationModule : AbpModule
{[DependsOn(typeof(MyProjectDomainModule))]// ...
}// Entity Framework Core 模块
public class MyProjectEntityFrameworkCoreModule : AbpModule
{[DependsOn(typeof(MyProjectDomainModule))]// ...
}// Web API 模块
public class MyProjectHttpApiModule : AbpModule
{[DependsOn(typeof(MyProjectApplicationModule),typeof(MyProjectEntityFrameworkCoreModule))]// ...
}// 启动模块
public class MyProjectHttpApiHostModule : AbpModule
{[DependsOn(typeof(MyProjectHttpApiModule))]// 这是实际在 Program.cs 中使用的模块
}
最佳实践
- 单一启动模块:每个应用程序只有一个入口模块
- 分层设计:按功能将模块分层(领域层、应用层、基础设施层等)
- 依赖明确:每个模块明确声明其依赖关系
- 关注点分离:每个模块负责特定的业务功能
总结
一个 .csproj 项目可以包含:
- 1个启动模块(在
AddApplication<T>()中指定) - 任意数量的依赖模块(通过
[DependsOn]声明) - 通常有5-10个或更多模块,具体取决于应用的复杂性
这种设计使得 ABP 应用具有高度的模块化和可维护性。
项目创建规则
┌─────────────────┐
│ 表现层/API层 │ (外层)
├─────────────────┤
│ 应用层 │
├─────────────────┤
│ 核心/基础设施层 │ ← 依赖 ←
├─────────────────┤
│ 领域层 │ (内层)
└─────────────────┘
视图层
创建一个模块 JobToDDDAPIModule.cs
using Microsoft.OpenApi.Models;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Modularity;namespace DDD_ABP初试
{[DependsOn(typeof(AbpAspNetCoreMvcModule))]public class JobToDDDAPIModule : AbpModule{public override void ConfigureServices(ServiceConfigurationContext context){context.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklecontext.Services.AddEndpointsApiExplorer();context.Services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new OpenApiInfo{Title = "JobToDDD API",Version = "v1"});});}public override void OnApplicationInitialization(ApplicationInitializationContext context){var app = context.GetApplicationBuilder();// Configure the HTTP request pipeline.if (context.GetEnvironment().IsDevelopment()){app.UseSwagger();app.UseSwaggerUI(c =>{c.SwaggerEndpoint("/swagger/v1/swagger.json", "JobToDDD API v1");});}app.UseRouting(); // 添加路由中间件app.UseAuthorization();app.UseEndpoints(configure => configure.MapControllers());}}
}

领域层 Domain
│ DDD-ABP.Domain.csproj
│ JobToDddDmainModule.cs
├─DomainServices //领域服务(业务)
├─Entities //实体
│ City.cs
├─EventHandlers //领域事件
└─Repositories //仓储接口
导入
Volo.Abp.Ddd.Domain
Volo.Abp.Core
JobToDddDmainModule.cs
using Volo.Abp.Domain;
using Volo.Abp.Modularity;namespace DDD_ABP.Domain
{[DependsOn(typeof(AbpDddDomainModule))]public class JobToDddDomainModule: AbpModule{}
}
一个简单实体
namespace DDD_ABP.Domain.Entities
{public class City : Entity<Guid>{public string CityName { get; set; }}
}
在ABP框架中,实体类继承 Entity 类有以下几个重要原因:
- 基础设施支持
• Entity 基类提供了ABP框架所需的基础设施,包括主键定义、审计属性、软删除等功能
• 它为领域实体提供了与ABP ORM和其他子系统集成所需的基本能力- 统一的标识符管理
•Entity<Guid>提供了标准的主键定义方式
• 支持不同的主键类型(如 int、long、Guid 等)
• 统一了实体标识符的处理方式- 内置功能集成
• 自动集成审计功能(创建时间、修改时间等)
• 支持软删除机制
• 提供并发控制支持
• 集成事件总线系统- ORM兼容性
• 与EF Core等ORM框架良好集成
• 提供了ABP特有的数据过滤机制
• 支持仓储模式的标准实现- 约定优于配置
• 遵循ABP框架的设计约定
• 减少样板代码的编写
• 提高开发效率和代码一致性
数据基础层 Core
1 导入
Volo.Abp.EntityFrameworkCore
Volo.Abp.EntityFrameworkCore.SqlServer
Volo.Abp.Core
2 引入领域层 DDD_ABP.Domain
3 创建Context
JobToDddContext.cs
namespace DDD_ABP.Core
{public class JobToDddContext : AbpDbContext<JobToDddContext>{public DbSet<City> Cities { get; set; }public JobToDddContext(DbContextOptions<JobToDddContext> options) : base(options){}}
}
4 创建
JobToDddCoreModule.cs
using DDD_ABP.Domain;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;namespace DDD_ABP.Core
{[DependsOn(typeof(AbpEntityFrameworkCoreModule),typeof(JobToDddDomainModule))]public class JobToDddCoreModule:AbpModule{public override void ConfigureServices(ServiceConfigurationContext context){/** ABP对比 AddDbContext 的写法,ABP方式 (AddAbpDbContext + AbpDbContextOptions)* • 自动仓储: options.AddDefaultRepositories() 为所有实体自动生成仓储实现• ABP集成: 与ABP的依赖注入、UnitOfWork等系统无缝集成• 扩展性: 支持自定义仓储和覆盖默认行为*/context.Services.AddAbpDbContext<JobToDddContext>(options =>{/*** 1. AddDefaultRepositories方法1. includeAllEntities: false (默认)• 只为聚合根(Aggregate Root)实体生成仓储• 普通实体(仅继承自 Entity<>)不会生成仓储• 遵循DDD最佳实践原则2. includeAllEntities: true• options.AddDefaultRepositories(includeAllEntities: true);• 为所有实体生成仓储(包括普通实体和聚合根)• 不区分实体类型,全部生成仓储实现• 适用于快速开发或简单应用场景2. AddRepository方法• 添加自定义的仓储实现• 参数:实体类型和仓储实现类型*/options.AddDefaultRepositories(); });/*** 1. Configure方法• 这是ABP模块中用于配置选项的标准方法• Configure<AbpDbContextOptions> 表示要配置 AbpDbContextOptions 这个配置类• 这种写法是ABP框架特有的配置方式2. AbpDbContextOptions作用• 专门用于配置ABP的数据库上下文选项• 包含数据库提供程序、连接字符串等配置• 与标准的 DbContextOptions 相比,提供了更多ABP特有的功能3. UseSqlServer方法• 指定使用SQL Server作为数据库提供程序• ABP提供了多种数据库提供程序支持:• UseSqlServer() - SQL Server• UseMySql() - MySQL• UsePostgreSql() - PostgreSQL• UseOracle() - Oracle等*/Configure<AbpDbContextOptions>(options =>{options.UseSqlServer();});}}
}
5 配置 appsettings.json
添加 ConnectionStrings.Default,Default 是ABP 默认规则
{"ConnectionStrings": {"Default": "Service=127.0.0.1;database=XXXX;uid=XXX;pwd=XXX;"},"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*"
}应用层 Application
1 导入
Volo.Abp.Core
Volo.Abp.AutoMapper
2 引入
Volo.Abp.Ddd.Application
3 JobToDddApplicationModule.cs
using DDD_ABP.Core;
using Volo.Abp.Application;
using Volo.Abp.AutoMapper;
using Volo.Abp.Modularity;namespace DDD_ABP.Application
{[DependsOn(typeof(AbpDddApplicationModule),typeof(AbpAutoMapperModule),typeof(JobToDddCoreModule) // 引用Core模块,因为引用了领域层 JobToDddDomainModule, 所以这里就不用导入项目层中的 DDD-ABP.Domain)]public class JobToDddApplicationModule: AbpModule{override public void ConfigureServices(ServiceConfigurationContext context){Configure<AbpAutoMapperOptions>(options =>{options.AddProfile<JobToDddProfile>();});}}
}
创建一个 automapper 配置文件
JobToDddProfile.cs
namespace DDD_ABP.Application
{internal class JobToDddProfile : Profile{public JobToDddProfile(){//举例:假设有一个领域实体 Job 和一个 DTO JobDto//CreateMap<Job, JobDto>();}}
}
其他工作
1 API 导入服务层,并且添加引用应用层模块
//• [DependsOn(...)]:声明该模块依赖的其他ABP模块,确保它们在当前模块之前初始化[DependsOn(typeof(AbpAspNetCoreMvcModule), //依赖ABP的ASP.NET Core MVC模块typeof(JobToDddApplicationModule) //依赖应用层模块)]public class JobToDDDAPIModule : AbpModule
2 视图模型数据 Dto
EntityDto
// 创建DTO - 无ID
public class CreateCityDto
{public string Name { get; set; }public string Code { get; set; }
}// 更新DTO - 有ID
public class UpdateCityDto : EntityDto<Guid>
{public string Name { get; set; }public string Code { get; set; }
}// 输出DTO - 有ID
public class CityDto : EntityDto<Guid>
{public string Name { get; set; }public string Code { get; set; }
}
