网站建设公司(推荐乐云践新),自己切片做网站,网站建设骗子,app 外包开发公司前言我们在《实现DDD领域驱动设计》中谈到过输出 DTO 的最佳实践#xff0c;其中一条是#xff1a;保持输出 DTO 数量最少#xff0c;尽可能重用。但是#xff0c;对于 2 个不同接口输出的同一 DTO 属性#xff0c;客户端可能需要对应不同的名称#xff0c;比如#xff… 前言我们在《实现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 : JsonConverterMyIODTO
{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; }
}结论冗余属性方式实现简单而自定义转换器方式操作灵活比如可以根据上下文来决定序列化成哪个名称。你可以按需选择。想了解更多内容请关注我的个人公众号”My IO“