
聚合器是CodeSpirit框架中的一个强大功能,旨在解决API响应数据中ID字段需要转换为实际名称显示的问题。通过简洁的语法,它能满足字段替换和补充需求,无需修改后端业务逻辑即可实现数据聚合。
一、聚合器工作原理
聚合器作为中间件,在HTTP响应返回客户端前对JSON数据进行处理,根据预设规则自动替换或补充字段值。它支持三种基本模式:静态替换、动态替换和动态补充。
二、聚合器语法设计
HTTP 头部定义:
X-Aggregate-Keys: <字段规则列表>
语法规则
/user/10002 获取 name 字段值,如 User-1000210002 → User-10002将数据源字段追加到原值后(默认分隔符为空格):
items.createdBy=/user/{value}.fullName#{value} ({field})
示例解析
原始数据:
{
"id": 123,
"title": "测试文档",
"createdBy": "10001",
"updatedBy": "10002",
"items": [{"itemId": 1,
"createdBy": "10003"}]
}HTTP 头部配置:
X-Aggregate-Keys: createdBy#User-{value}, updatedBy=/user/{value}.name, items.createdBy=/user/{value}.fullName#{value} ({field})
处理流程:
1. 静态替换 createdBy
直接应用模板:User-{value}`→ User-10001
2. 动态替换 updatedBy
请求 /user/10002返回 {"name": "User-10002"} → 替换为 User-10002
3. 动态补充 items.createdBy
请求 /user/10003 返回 {"fullName": "User-10003"} → 应用模板 {value} ({field}) → 10003 (User-10003)
最终结果:
{
"id": 123,
"title": "测试文档",
"createdBy": "User-10001",
"updatedBy": "User-10002",
"items": [{"itemId": 1, "createdBy": "10003 (User-10003)"}]
}三、数据处理流程
1.解析聚合规则:中间件从HTTP响应头中获取 X-Aggregate-Keys 值
2.JSON解析:使用 Newtonsoft.Json 将响应体解析为JSON对象
3.规则应用:对每个匹配的字段路径应用相应规则
4.嵌套处理:自动识别和处理嵌套对象和数组
5.重新序列化:将处理后的JSON对象转换回字符串
四、语法说明表

五、使用示例
public class UserModel
{
public string Id { get; set; }
[AggregateField(dataSource: "/api/users/{value}.name", template: "用户: {field}")]
public string Name { get; set; }
[AggregateField(template: "https://example.com/avatar/{value}")]
public string AvatarUrl { get; set; }
}呈现效果:

六、聚合器高级用法
七、未来规划
/// <summary>
/// 配置发布历史DTO
/// </summary>
public class ConfigPublishHistoryDto
{
/// <summary>
/// 应用ID
/// </summary>
[DisplayName("应用ID")]
public string AppId { get; set; }
/// <summary>
/// 发布时间
/// </summary>
[DisplayName("发布时间")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm:ss}")]
public DateTime CreatedAt { get; set; }
/// <summary>
/// 发布人(通过CreatedBy属性获取发布人信息)
/// TODO: 应提供聚合器独立的内部接口
/// </summary>
[DisplayName("发布人用户Id")]
public string CreatedBy { get; set; }
[DisplayName("发布人")]
[AggregateField(dataSource: "http://identity/api/identity/users/{CreatedBy}.data.name", template: "用户: {field}")]
public string CreatedName { get; set; }
}/// <summary>
/// 配置发布历史DTO
/// </summary>
public class ConfigPublishHistoryDto
{
/// <summary>
/// 应用ID
/// </summary>
[DisplayName("应用ID")]
public string AppId { get; set; }
...
/// <summary>
/// 发布时间
/// </summary>
[DisplayName("发布时间")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm:ss}")]
public DateTime CreatedAt { get; set; }
/// <summary>
/// 发布人(通过CreatedBy属性获取发布人信息)
/// TODO: 应提供聚合器独立的内部接口
/// </summary>
[DisplayName("发布人用户Id")]
public string CreatedBy { get; set; }
[DisplayName("发布人信息")]
[AggregateField(dataSource: "http://identity/api/identity/users/{CreatedBy}.data")]
public UserDto CreatedName { get; set; }
}