ASP.Net DTO 上的 Web API 验证属性

本文关键字:API 验证 属性 Web 上的 Net DTO ASP | 更新日期: 2023-09-27 18:32:50

我正在使用 ASP.Net Web API 和代码优先实体框架,从我所读到的内容来看,您通常应该直接在操作方法中公开 DTO 对象而不是实体对象(根据 http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-5(。

因此,在我正在处理的一种情况下,为了避免上面链接中所述的"过度发布"问题,我创建了一个DTO对象,该对象具有与模型对象几乎相同的所有属性。但是,我想知道的是我是否需要复制所有相同的验证属性集(例如。DTO和模型属性的[必需],[范围(N,M(]等?最初我希望不要(以避免重复(,但是如果您想利用绑定验证(即。ModelState.IsValid(和主模型(如果您希望使用适当的约束([必需] -> 不为 null 等(创建数据库。

没有更好的方法吗?

此外,实体是否使用某些属性,但模型绑定验证不使用?例如,虽然 [Range(n,m(] 显然会影响对某些客户端输入的验证,但实体是否根本不关心它(据我所知,它似乎不会影响创建的数据库模式?

ASP.Net DTO 上的 Web API 验证属性

实体应该只具有实际对数据库产生影响的属性。DTO 不应具有任何用于验证的属性,除了用于定义属性是否需要以及应以何种顺序显示属性等的 DataMemberAttribute 之外。对于 OData,您还必须设置 KeyAttribute。模型应具有验证属性。由于DTO和模型可能几乎相同,因此您为每个dto创建需要验证模型的dto,只需将dto的值交换到模型的对象即可。现在您可以验证它,如果您没有对模型使用验证属性,则可以使用FluentValidation等方式对其进行验证。

长话短说:

  • 实体仅获取实际影响数据库架构的属性

  • DTO 是没有验证逻辑的简单对象,除了 DataMemberAttribute

  • 模型应具有验证属性(仅在需要时,使用FluentValidation时不需要(

开机自检的工作流程将是:-> DTO进来 -> 将DTO交换到模型 -> 验证模型 -> 将模型交换到实体 -> 在数据库中存储实体 -> 使用更新的实体并将其交换到新的DTO -> 返回 DTO

问候电流的