.NET CORE如何为同一DTO属性指定2个名称
前言
我们在《实现DDD领域驱动设计》中谈到过输出 DTO 的最佳实践,其中一条是:
- 保持输出 DTO 数量最少,尽可能重用。
但是,对于 2 个不同接口输出的同一 DTO 属性,客户端可能需要对应不同的名称,比如:
public class MyIODTO { [JsonPropertyName("pageNumer")] //用于 B 接口返回 [JsonPropertyName("pageNum")] //用于 A 接口返回 public int PageNum { get; set; } }
这样显然无法编译成功:

那怎么实现呢?
解决方案
1. 冗余属性
输出 DTO 另外一条最佳实践:
- 输出 DTO 可以包含比客户端代码中使用的更多的属性。
因此,我们可以增加一个属性,用于第 2 个名称,但是第 2 个属性只是用于返回第 1 个属性的值:
public class MyIODTO { [JsonPropertyName("pageNum")] public int PageNum { get; set; } [JsonPropertyName("pageNumer")] public int PageNumer => PageNum; }
2. 自定义转换器
上面的方式虽然可以解决问题,但是需要创建一个额外的属性。
更灵活的方式,是编写自定义转换器,自己处理 JSON 序列化的工作:
public class MyIOConverter : JsonConverter<MyIODTO> { public override MyIODTO Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { throw new NotImplementedException(); } public override void Write( Utf8JsonWriter writer, MyIODTO dto, JsonSerializerOptions options) { writer.WriteStartObject(); writer.WriteNumber("pageNum", dto.PageNum); writer.WriteNumber("pageNumer", dto.PageNum); //序列化其他属性 ... writer.WriteEndObject(); } }
然后为 DTO 指定自定义转换器:
[JsonConverter(typeof(MyIOConverter))] public class MyIODTO { public int PageNum { get; set; } }
结论
冗余属性方式实现简单,而自定义转换器方式操作灵活,比如可以根据上下文来决定序列化成哪个名称。你可以按需选择。
原文地址:https://www.dongchuanmin.com/net/2018.html

浙公网安备 33010602011771号