当我的API的消费者试图对客户进行更新时,我必须验证三件事。
在以下情况下阻止客户更新:
名字或姓氏为空白
对于某个国家/地区,如果客户的X内部集合为空,则抛出异常。 X很难解释,所以假设它是一些集合。对于所有其他国家/地区,X不适用/将始终为空。但如果它是某个国家,则需要X.所以它几乎是一个条件必需属性。客户属于某个国家/地区,因此它会从发送的JSON中找到。
如果数据库中的某些条件为真,则阻止客户更新。
所以基本上我遇到了以下问题,我想就最合适的解决方法提出一些建议:
在保存之前,是否创建了一个动作过滤器来对客户实体进行验证?或者,最好是创建从ValidationAttribute派生的自定义验证属性并覆盖IsValid成员函数。
基本上是一个说法的问题 if(名字是空的,如果是x,如果是y等)vs(!ModelState.IsValid)
然后使用IsValid使自定义属性起作用。
似乎验证属性最适合"简单"验证,即必填字段。但是一旦你开始涉及像#34;我需要查看我的数据库,或者分析自定义值的http请求标头,并基于此,invalid = false"那么做这种与实体如此接近的东西几乎是错误的。
思想?
谢谢!
答案 0 :(得分:2)
我非常喜欢FluentValidation:https://github.com/JeremySkinner/FluentValidation
正如您所提到的,内置验证属性是有限的。对于复杂的验证,您最好实现自己的属性或使用这样的库。
我喜欢FluentValidation的一件事是它在模型级而不是字段级执行,这意味着您可以使用相关字段的值进行验证。例如
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
(代码摘录自项目的Wiki页面)
它也是可扩展的,因此您也可以在此库之上开发自己的自定义验证器。