DTO构造函数参数验证和WebApi响应

时间:2017-04-17 20:59:22

标签: c# .net oop asp.net-web-api2 dto

如果我开发了一个WebApi动作方法

[Route]
public string Put([FromBody]MyClass value)

使用在构造函数中具有参数验证的MyClass类是非常糟糕的,如:

public MyClass(string value)
{
    if (!_pattern.IsMatch(value))
            throw new ArgumentException($"Value should match RegEx: {_pattern}", nameof(value));
}

因此,在错误的请求中,它会从JsonMediaTypeFormatter.ReadFromStreamAsync中抛出异常,这会发生在控制器或操作过滤器之外,所以我找不到用ArgumentException消息来回复客户端的真实问题描述的方法。

即使是这样的参数检查还没有放在DTO中,WebApi和真实(域模型)MyClass中唯一允许的是否应该创建相应的简单契约类而不进行任何检查?

2 个答案:

答案 0 :(得分:1)

使用API​​中的结构化消息创建ErrorDto。有ExceptionFilter来处理这个问题是很常见的做法。

就验证反馈而言,您可能需要查看this article by Martin Fowler about avoiding to use exceptions as an approach to validation

话虽如此,你可能会发现this library interesting

答案 1 :(得分:1)

顺便说一下,我发现如果Dto从构造函数(控制器外)抛出ArgumentException,你仍然可以使用

[Route]
[ValidateModel]
public string Put([FromBody]MyClass value)

{
  "Message": "The request is invalid.",
  "ModelState": {
    "value": [
      "Value should match RegEx: ...\r\nParameter name: value"
    ]
  }
}

那将通过

回复客户
{{1}}

但是,当纯DTO与DataAnnotations指定所有问题时,它仍然只允许通知第一个发现的问题。