C#请求类中条件属性序列化的处理方案问询
批量插入时忽略特定属性的解决方案
现有项目中的请求类定义如下:
public class InsertStudentRequest : IRequest<InsertStudentResponse> { [JsonIgnore] public int Id { get; set; } public string Name { get; set; } public string StdNo { get; set; } public Transcript Transcript { get; set; } } public class InsertBulkStudentRequest : IRequest<InsertBulkStudentResponse> { public List<InsertStudentRequest> Requests { get; set; } }
需求为:单个插入请求允许录入Transcript属性,批量插入请求时忽略该属性,且不能直接给Transcript加[JsonIgnore]标记。以下是几种可行的解决方案:
方案1:拆分请求类(最直观易维护)
创建分场景的请求类,让每个类只负责对应场景的属性需求:
// 单条插入专用请求类,保留Transcript public class InsertSingleStudentRequest : IRequest<InsertStudentResponse> { [JsonIgnore] public int Id { get; set; } public string Name { get; set; } public string StdNo { get; set; } public Transcript Transcript { get; set; } } // 批量插入专用的子请求类,移除Transcript public class InsertBulkStudentItemRequest { [JsonIgnore] public int Id { get; set; } public string Name { get; set; } public string StdNo { get; set; } } // 批量插入请求类 public class InsertBulkStudentRequest : IRequest<InsertBulkStudentResponse> { public List<InsertBulkStudentItemRequest> Requests { get; set; } }
这种方式职责清晰,后续维护时不会出现属性混淆问题,不需要额外配置序列化规则。
方案2:条件序列化(基于Newtonsoft.Json)
如果不想拆分类,可利用Newtonsoft.Json的ShouldSerialize特性实现动态控制:
public class InsertStudentRequest : IRequest<InsertStudentResponse> { [JsonIgnore] public int Id { get; set; } public string Name { get; set; } public string StdNo { get; set; } public Transcript Transcript { get; set; } // 标记是否允许序列化Transcript,默认开启(单条插入场景) [JsonIgnore] public bool AllowTranscriptSerialization { get; set; } = true; // Newtonsoft.Json会自动调用该方法决定是否序列化Transcript public bool ShouldSerializeTranscript() { return AllowTranscriptSerialization; } }
处理批量请求时,遍历设置标记即可:
public async Task<InsertBulkStudentResponse> Handle(InsertBulkStudentRequest request, CancellationToken cancellationToken) { foreach(var req in request.Requests) { req.AllowTranscriptSerialization = false; } // 后续插入逻辑 }
注:如果项目使用System.Text.Json,需自定义JsonConverter实现类似逻辑
方案3:DTO映射(兼容已有逻辑)
如果原请求类已被大量代码引用,不想修改或拆分,可创建批量专用DTO,通过映射隔离差异:
// 批量插入专用DTO,不含Transcript public class InsertBulkStudentItemDto { [JsonIgnore] public int Id { get; set; } public string Name { get; set; } public string StdNo { get; set; } } // 修改批量请求类 public class InsertBulkStudentRequest : IRequest<InsertBulkStudentResponse> { public List<InsertBulkStudentItemDto> Requests { get; set; } }
处理请求时手动映射,忽略Transcript:
public async Task<InsertBulkStudentResponse> Handle(InsertBulkStudentRequest request, CancellationToken cancellationToken) { var studentRequests = request.Requests.Select(dto => new InsertStudentRequest { Id = dto.Id, Name = dto.Name, StdNo = dto.StdNo // 不赋值Transcript,自然忽略该属性 }).ToList(); // 后续插入逻辑 }
内容的提问来源于stack exchange,提问作者Onur Sercan
相关产品推荐
相关产品推荐

