用途
该技能面向使用 ASP.NET Boilerplate(ABP)框架与 .NET 10.0 的开发者,提供针对 EAF(Enterprise Application Foundation)中间件模块的专家级开发指导。EAF 项目基于 ABP 框架构建,自定义中间件模块位于 src 目录,为基于 ABP 的应用提供企业级功能。技能目标是帮助编写功能完整、可维护、高性能且可扩展的代码,并遵循 ABP 与 .NET 最佳实践。
项目背景与当前状态
- .NET 版本:10.0
- ABP 版本:基于 ABP 的自定义 EAF 实现
- 数据库:支持 SQL Server 与 SQLite
- 架构:N 层架构(领域层、应用层、基础设施层)
EAF 中间件模块(src/)
- Eaf.Castle.Serilog:与 Castle Windsor 集成的 Serilog 日志
- Eaf.KeyVault:Azure Key Vault 集成
- Eaf.KeyVault.AspNetCore:Azure Key Vault 的 ASP.NET Core 集成
- Eaf.Log4NetServiceBus:Log4Net 与 Service Bus 集成
- Eaf.Middleware.Application:应用层中间件
- Eaf.Middleware.AzureActiveDirectory:Azure AD 集成
- Eaf.Middleware.Core:核心中间件抽象
- Eaf.Middleware.Ldap:LDAP 身份验证集成
- Eaf.Middleware.Web.Core:Web 核心中间件
- Eaf.Middleware.Worker:后台工作器中间件
- Eaf.OpenTelemetry:OpenTelemetry 可观测性
- Eaf.SqlServerCache:SQL Server 分布式缓存
- Eaf.SqliteCache:SQLite 分布式缓存
主要能力
N 层架构
领域层:实体继承自 Entity、AggregateRoot 或 FullAuditedEntity;仓储使用 IRepository<TEntity, TKey>;领域服务承载不适合放入实体的业务逻辑;规约(Specifications)封装查询逻辑;领域事件通过 IDomainEventHandler 实现事件驱动架构;值对象为无标识的不可变对象。
应用层:应用服务继承自 ApplicationService 或 IApplicationService;使用 DTO 作为输入输出;通过 DataAnnotations 或 FluentValidation 进行验证;使用 [AbpAuthorize] 特性进行授权;使用 [RequiresFeature] 进行功能管理;通过 IAuditingStore 自动记录审计日志。
基础设施层:使用 EfCoreRepositoryBase 实现自定义仓储;使用 EF Core 迁移;集成 Hangfire 或 Quartz 后台任务;SignalR 实时通知;通过 ICacheManager 实现分布式缓存。
依赖注入
ABP 使用 Castle Windsor 进行依赖注入,支持构造函数注入。依赖生命周期包括:ITransientDependency(每次创建)、ISingletonDependency(单实例)、IScopedDependency(按请求作用域)。
常用 ABP 服务
- 会话管理:通过 IAbpSession 获取当前用户 ID 等
- 设置管理:通过 ISettingManager 读取设置值
- 缓存:通过 ICacheManager 获取缓存并回源
- 日志:通过 ILogger 记录信息与错误
多租户
EAF 支持多租户,可使用数据过滤器。可通过 DisableFilter(AbpDataFilters.MayHaveTenant) 禁用租户过滤器以执行宿主操作,或通过 SetTenantId(tenantId) 设置租户上下文。
授权
通过权限定义类声明权限常量(如 Pages.Users、Pages.Users.Create 等),使用 [AbpAuthorize] 特性标注,也可通过 PermissionChecker.IsGrantedAsync 以编程方式检查权限。
后台任务
后台任务继承 BackgroundJob<Args> 并实现 ITransientDependency,在 Execute 方法中处理逻辑。
工作单元
ABP 自动使用工作单元模式:应用服务中自动启动并提交;也可通过 _unitOfWorkManager.Begin() 手动控制并调用 CompleteAsync 提交。
对象映射
使用与 ABP 集成的 AutoMapper:定义 Profile 映射配置,在应用服务中通过 ObjectMapper.Map 进行转换。
EAF 特定模式
- 模块初始化:通过 [DependsOn(typeof(AbpKernelModule))] 声明依赖,在 Initialize 中按约定注册程序集
- Serilog 集成:依赖 AbpCastleSerilogModule,自动配置 Serilog
- Key Vault 集成:通过 IEafKeyVaultManager 的 GetSecretAsync 获取密钥
- OpenTelemetry 集成:依赖 EafOpenTelemetryModule,自动收集指标、追踪与日志
- SQL Server 缓存:依赖 AbpRedisCacheModule 与 EafSqlServerCacheModule,配置 SQL Server 分布式缓存,可用时回退到 Redis
数据库最佳实践
DbContext 继承 AbpDbContext,在 OnModelCreating 中配置实体表名与约定;自定义仓储接口继承 IRepository,实现继承 EfCoreRepositoryBase。
配置
appsettings.json 中可配置连接字符串、站点根地址、Redis 配置等;模块可在 PreInitialize 中追加 AutoMapper 配置。
测试
单元测试可继承 AbpIntegratedTestBase,通过 Resolve 获取服务并断言结果。
常见问题与解决方案
- 循环依赖:改用属性注入、拆分服务或使用 Lazy<T> 延迟初始化
- 性能问题:对频繁访问数据使用缓存、使用投影优化查询、使用 IQueryable 在数据库端操作、长任务考虑后台作业
- 多租户问题:访问数据前检查租户上下文、正确使用数据过滤器、同时测试宿主与租户场景
文件命名约定
实体位于 Entities 文件夹,DTO 位于 Dtos 文件夹,应用服务位于 AppServices 文件夹,接口与实现同目录;类名使用 PascalCase,方法参数使用 camelCase。
使用方式
该技能以指导性内容形式提供,供开发者在编写 ABP/EAF 代码时参考。资料未提供具体的安装命令或调用步骤。
适用场景
适用于基于 ASP.NET Boilerplate 与 EAF 中间件构建企业级 .NET 10.0 应用的开发工作,包括领域建模、应用服务编写、依赖注入配置、多租户与授权实现、缓存与日志集成、数据库访问与测试等。
限制
资料未提供该技能的收费、价格、平台支持范围或效果保证等信息。