【问题标题】:CustomConverter to compare to a property on the same class in web apiCustomConverter 与 web api 中同一类的属性进行比较
【发布时间】:2020-01-07 05:18:52
【问题描述】:

我一直在编写一些自定义转换器,扩展 Newtonsofts JsonConverter 并偶然发现了一个小问题。假设我在一个类上有两个属性,但它们不能是相同的值。是否可以在转换器中找到另一个属性的值...例如,假设我有一个这样的模型。

我希望能够在 CustomCompareConverter 中检查 Surname 的值,以确保它与 Firstname 的值不同

public class Person
{
    [JsonConverter(typeof(CustomCompareConverter), "Surname")]
    public string Firstname { get; set; }

    public string Surname { get; set; }
}
```

【问题讨论】:

标签: asp.net-core asp.net-web-api json.net asp.net-core-2.2


【解决方案1】:

你正试图用真正应该分开的 json 反序列化过程做很多事情

  1. 将一些外部 json 转换为您的域对象

  2. 验证域对象。

Surname 不能匹配 FirstName 属性这一事实是您域的业务规则。因此,请将其保留在您的域中。你可以:

  1. 编写一个单独的验证器类来检查你的状态 person 对象并返回验证失败列表
  2. 在您的 Person 类上实现 IValidatableObject 并实现 界面
  3. 编写一个自定义验证器,如SO question

将 JSON 反序列化过程用作防损坏层,以将外部系统的详细信息排除在您的域结构之外。获取外部对象并将其转换为域对象后,请使用常规方法验证您的域对象。

【讨论】:

  • 我通常同意但...您已经序列化为对象的事实意味着您已经丢失了验证发生位置的上下文。举个例子,我有一个客户列表。对象本身的验证不会为您提供验证发生失败的客户的任何上下文。是客户 1 还是 1000?这是整个验证部分的大问题(除非有人另有说明)。
  • 您将对列表中的每个项目调用验证。你怎么会不知道哪一个失败了?
  • 对不起。当然我会知道哪个 person 对象没有通过验证。我不能告诉消费者问题是 Customer[12].Firstname(除非我做错了什么)。我只能说被验证的客户是错误的。因此,如果我在 100 个失败的列表中有 3 个客户,我所能做的就是输出 3 条错误消息。
  • 如果你使用 IValidatableObject 你会得到一个 IEnumerable 所以你知道失败的对象和失败。你还需要什么?
  • 它没有告诉我 1) 集合中失败的确切项目 2) 请求中失败的行 3) 文件中的位置。这也意味着您会遇到两组错误。第一个是 json 验证,第二个是对象验证。这不是一个很好的用户体验。他们可能必须提交两次请求才能获得工作休息服务电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 2012-07-12
相关资源
最近更新 更多