用途
本技能面向 ABP Framework 的应用层开发,整理了一套可复用的服务模式,用于组织 AppService、DTO、对象映射、事务与查询过滤等常见代码结构。
主要能力
应用服务模式
以 ApplicationService 为基类实现接口,通过构造函数注入仓储、领域服务与映射器。示例中 PatientAppService 注入 IRepository<Patient, Guid>、领域服务 PatientManager 与 ClinicApplicationMappers,并在各方法上使用 [Authorize] 标注权限(如 ClinicPermissions.Patients.Default、Create、Edit、Delete)。
Mapperly 对象映射
资料说明 ABP 10.x 使用 Mapperly(源生成器)替代 AutoMapper。通过 [Mapper] 标注 partial class,声明实体到 DTO、DTO 到实体、更新映射等方法。更新映射可用 [MapperIgnoreTarget(nameof(Patient.Id))] 忽略 Id;复杂映射可用 [MapProperty] 指定导航属性到 DTO 字段的对应关系。映射器需在模块的 ConfigureServices 中注册,例如 context.Services.AddSingleton<ClinicApplicationMappers>();。
工作单元(Unit of Work)
ABP 会自动为应用服务方法管理 UoW,方法内的所有变更一起提交,异常时回滚。也可手动控制:用 [UnitOfWork(isTransactional: false)] 关闭只读方法的事务;用 _unitOfWorkManager.Begin(requiresNew: true) 与 uow.CompleteAsync() 为批量处理中的每一项开启独立工作单元。
Filter DTO 模式
将查询过滤条件与分页参数分离,形成自描述的 API。示例 PatientFilter 包含 DoctorId、Name、Email、IsActive、CreatedAfter、CreatedBefore 等可空字段。在 AppService 中先对字符串做 Trim,设置默认排序,再用 WhereIf 按条件拼接查询,最后通过 AsyncExecuter.CountAsync 与 AsyncExecuter.ToListAsync 配合 OrderBy、PageBy 返回 PagedResultDto<PatientDto>。
ResponseModel 包装
提供泛型 ResponseModel<T>,含 IsSuccess、Data、Message 字段,以及静态方法 Success 与 Failure,用于统一返回成功或失败结果。
CommonDependencies 模式
用泛型类 CommonDependencies<T> 聚合横切依赖(IDistributedEventBus、IDataFilter、ILogger<T>、IGuidGenerator),通过 context.Services.AddTransient(typeof(CommonDependencies<>)); 注册,以减少构造函数参数膨胀。
结构化日志与输入清洗
示例展示在方法开始、完成、失败时以统一格式记录日志,并输出输入对象与异常信息。输入清洗提供扩展方法 TrimAndLower、TrimAndUpper,用于规范化字符串输入。
映射校验模式
资料指出手动映射(尤其在 select new 子句中)容易出现复制粘贴错误,例如把 IsPutawayCompleted 错误地映射自 lc.IsInboundQCChecklistCompleted。建议优先使用 Mapperly 避免此类问题;若必须手动映射,需逐项核对 DTO 属性与实体属性的对应关系,特别留意相似命名属性(如 IsXxxCompleted 与 IsYyyCompleted)、可选导航属性的空值检查,并避免未修改地复制相邻行。资料还给出高风险属性对照表,例如 IsPutawayCompleted 应来自 entity.IsPutawayCompleted 而非 entity.IsInboundCompleted,UpdatedAt 应来自 entity.LastModificationTime 而非 entity.CreatedAt,CustomerName 应来自 entity.CustomerName 而非 entity.ShipperName,TargetDate 应来自 entity.TargetDate 而非 entity.SourceDate。
使用方式
资料以 C# 代码片段形式给出各模式的实现与注册方式,可直接参考示例结构在 ABP 项目中编写应用服务、映射器、过滤器与响应包装。
适用场景
适用于使用 ABP Framework 构建 .NET 应用、需要规范应用层代码结构、统一映射与查询过滤、减少映射错误的开发场景。
限制
资料未提供安装命令、版本兼容范围、性能数据或收费信息;具体 API 行为以 ABP 官方文档为准。