跳到主要内容
版本:Next

应用服务契约定义

本文档中引用的文件

目录

  1. 简介
  2. 接口继承与扩展
  3. 核心操作方法详解
  4. 数据传输对象(DTO)设计
  5. RESTful API 映射
  6. 异常处理机制
  7. 导入导出功能实现
  8. 调用示例
  9. 依赖关系与架构图
  10. 总结

简介

IMyEntityNameAppService 是 CMS 插件系统中用于管理 MyEntityName 实体的核心应用服务契约接口。该接口基于 ABP 框架的 ICrudAppService 进行扩展,提供了完整的 CRUD(创建、读取、更新、删除)操作,并额外支持批量克隆、排序调整、数据导入导出等业务功能。

通过此接口,前端或其他客户端可以以标准化的方式与后端服务进行交互,所有操作均通过 DTO(数据传输对象)进行封装,确保了类型安全和数据一致性。接口通过控制器暴露为 RESTful API 端点,支持分页、排序、过滤等高级查询功能。

Section sources

接口继承与扩展

IMyEntityNameAppService 接口继承自 ABP 框架提供的 ICrudAppService<TDto, TKey, TGetListInput, TCreateInput, TUpdateInput> 泛型接口,具体实现如下:

public interface IMyEntityNameAppService : ICrudAppService<
MyEntityNameDto, // 数据传输对象
Guid, // 实体主键类型
GetMyEntityNamesInput, // 查询输入参数
MyEntityNameCreateDto, // 创建输入参数
MyEntityNameUpdateDto // 更新输入参数
>

这种设计使得该服务天然具备以下标准操作:

  • GetAsync(id):根据 ID 获取单个实体
  • GetListAsync(input):分页获取实体列表
  • CreateAsync(input):创建新实体
  • UpdateAsync(id, input):更新现有实体
  • DeleteAsync(id):删除实体

在此基础上,接口进一步扩展了插件特有的业务方法,如批量删除、克隆、排序调整、导入导出等。

Section sources

核心操作方法详解

标准 CRUD 方法

方法输入参数返回类型说明
GetAsyncGuid idTask<MyEntityNameDto>根据唯一标识获取单个 MyEntityName 实体
GetListAsyncGetMyEntityNamesInput inputTask<PagedResultDto<MyEntityNameDto>>分页查询 MyEntityName 列表,支持过滤和排序
CreateAsyncMyEntityNameCreateDto inputTask<MyEntityNameDto>创建新的 MyEntityName 实体
UpdateAsyncGuid id, MyEntityNameUpdateDto inputTask<MyEntityNameDto>更新指定 ID 的 MyEntityName 实体
DeleteAsyncGuid idTask删除指定 ID 的 MyEntityName 实体

扩展业务方法

方法输入参数返回类型说明
CloneAsyncIEnumerable<Guid> idsTask<List<MyEntityNameDto>>批量克隆指定 ID 的实体,名称自动追加“副本”标记
DeleteManyAsyncIEnumerable<Guid> idsTask批量删除多个实体
AdjustSortAsyncGuid id, int sortTask调整指定实体的排序值,并自动重排其他实体
ImportAsyncMyEntityNamesImportModel inputTask从 Excel 导入 MyEntityName 数据,支持增量更新
ExportAsyncGetMyEntityNamesInput inputTask<(Dictionary<string, object>, string)>导出数据为 Excel 格式,返回工作表数据和文件名

Section sources

数据传输对象(DTO)设计

MyEntityNameDto

表示 MyEntityName 实体的数据传输对象,继承自 ExtensibleEntityDto<Guid> 并实现 IHasConcurrencyStamp,用于并发控制。

属性说明:

  • Code:编号(字符串)
  • Name:名称(字符串)
  • Sort:排序(整数)
  • Remark:备注(字符串)
  • IsDisabled:是否禁用(布尔值)
  • ConcurrencyStamp:并发戳(用于乐观锁)

Section sources

GetMyEntityNamesInput

查询输入参数,继承自 ExtensiblePagedAndSortedResultRequestDto,支持分页、排序和过滤。

属性说明:

  • Filter:通用过滤条件
  • Name:按名称精确查询

Section sources

MyEntityNameCreateDto 与 MyEntityNameUpdateDto

分别用于创建和更新操作,均继承自 MyEntityNameCreateOrUpdateDtoBase

共同属性:

  • Code:编号
  • Name:名称
  • Remark:备注

特有属性:

  • MyEntityNameCreateDtoSort(可选排序值),IsDisabled(是否禁用,默认 false)
  • MyEntityNameUpdateDtoConcurrencyStamp(并发控制戳)

Section sources

导入导出模型

MyEntityNamesImportModel

用于 Excel 导入,包含一个 MyEntityNameImportModel 列表,每个模型对应一行数据。

MyEntityNamesExportModel

用于 Excel 导出,定义了导出列的名称和宽度,通过 ExcelColumn 特性标注。

Section sources

RESTful API 映射

MyEntityNameControllerIMyEntityNameAppService 接口映射为标准的 RESTful API 端点:

Diagram sources

Section sources

异常处理机制

服务在执行过程中会抛出以下类型的异常:

  • UserFriendlyException:用户友好型异常,用于提示前端用户具体错误信息,如:

    • 名称已存在
    • 导入数据格式错误
    • 必填字段为空
  • AbpValidationException:参数验证异常,由 ABP 框架自动触发,当输入 DTO 不符合验证规则时抛出。

  • ConcurrencyException:并发冲突异常,当多个用户同时修改同一实体时触发(通过 ConcurrencyStamp 控制)。

所有异常均通过全局异常过滤器(CMSExceptionFilter)统一处理并返回标准化错误响应。

Section sources

导入导出功能实现

导入流程

  1. 前端上传 Excel 文件
  2. 后端读取“配置”工作表数据
  3. 校验数据完整性(名称重复、必填项等)
  4. 区分新增与更新操作
  5. 调用 CreateAsyncUpdateAsync 批量处理
  6. 事务性提交,任一失败则整体回滚

导出流程

  1. 接收查询参数 GetMyEntityNamesInput
  2. 调用 ExportAsync 获取数据
  3. 使用 MiniExcel 库填充模板文件
  4. 返回 FileStreamResult 下载文件

Diagram sources

调用示例

获取实体列表(GET)

GET /api/v1/MyPluginName/MyEntityName?Filter=测试&Sorting=Name&MaxResultCount=10&SkipCount=0
Authorization: Bearer <token>

创建实体(POST)

POST /api/v1/MyPluginName/MyEntityName
Content-Type: application/json
Authorization: Bearer <token>

{
"code": "TEST001",
"name": "测试实体",
"remark": "这是一个测试",
"sort": 1
}

批量删除(DELETE)

DELETE /api/v1/MyPluginName/MyEntityName
Content-Type: application/json
Authorization: Bearer <token>

["a1b2c3d4-e5f6-7890-1234-567890abcdef"]

导入数据(POST)

POST /api/v1/MyPluginName/MyEntityName/Import
Content-Type: multipart/form-data
Authorization: Bearer <token>

File: data.xlsx

导出数据(GET)

GET /api/v1/MyPluginName/MyEntityName/Export?Filter=生产环境
Authorization: Bearer <token>

Section sources

依赖关系与架构图

Diagram sources

总结

IMyEntityNameAppService 接口通过继承 ABP 框架的 ICrudAppService,实现了标准化的 CRUD 操作,并在此基础上扩展了克隆、排序、导入导出等实用功能。接口设计遵循 RESTful 原则,通过 DTO 进行数据封装,确保了类型安全和可维护性。

控制器层将接口方法映射为 HTTP 端点,支持 JSON 和文件上传等多种交互方式。整个服务采用依赖注入和仓储模式,实现了业务逻辑与数据访问的解耦,便于测试和扩展。

该接口为前端提供了稳定、可预测的 API 合约,是插件系统中实体管理的核心服务契约。

Section sources