在ASP.NET MVC中使用域对象和视图模型时避免验证逻辑重复的良好实践

Val*_*yev 6 validation asp.net-mvc

常见场景:

层次结构域模型被映射到平面视图模型以用于呈现目的.

我在我的域中有一个完整的验证设置,并希望避免将视图模型映射到域对象,只是为了找出某些属性是无效的.我也不想在视图模型中复制验证逻辑.

这里有什么好的做法?

我反对视图模型和域对象的接口,因为视图模型通常是字符串和扁平的,而域对象通常是嵌套的,并且具有许多其他属性的数据类型.

我正在考虑一些可插拔的验证器,它将足够智能地验证域对象和视图模型,但对实现有点怀疑.

但为了简单起见,我倾向于这种方法:

服务器端验证仅在域模型中发生; 视图模型未经过验证,但使用JavaScript在客户端上验证数据.因此,在大多数情况下,我的视图模型将是有效的,验证逻辑将保留在一个位置,并且仅在域模型中发生.这种方法有一个缺点,即asp.net mvc 2验证将无法支持它.你怎么看?

谢谢.

Jas*_*ers 2

微软企业库提供了这样一个“可插入验证”库,如果没记错的话,它是基于泛型的。

我不喜欢它的工作方式,更不用说对其他 EL 组件的依赖数量,但它仍然值得一看。

我绝不是该领域的专家,但我坚信数据应该在您想要对其执行某些操作之前进行验证,并且始终在提交到存储库之前进行验证。因此,验证逻辑的最佳位置是业务逻辑层。客户端验证虽然让用户感到高兴,但却使代码维护成为一场噩梦,并且还会导致代码重复,这可能会进一步导致问题。

在我看来,您的演示对象应该是 DTO 的。当用户将数据提交回控制器(和 BLL)时,您可以使用解析器将表示对象转换为业务对象,然后可以对其进行验证。

我建议阅读 Rudy Lacovara 的博客(又名《愤怒的 .NET 开发人员》)。他是一个非常谦虚的人,在这样的事情上有很多好话要说。

华泰