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

6

常见场景:

为了展示目的,分层领域模型被映射到平面视图模型中。

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

这里有一些好的实践方法:

我反对为视图模型和领域对象都使用接口,因为视图模型通常是字符串和平面的,而领域对象经常是嵌套的并且有许多其他数据类型的属性。

我正在考虑一些可插拔的验证器,它将足够聪明,能够同时验证领域对象和视图模型,但对于实现持怀疑态度。

但为了简单起见,我倾向于采用以下方法:

服务器端验证仅在领域模型中进行;视图模型不会被验证,但是数据将通过JavaScript在客户端进行验证。因此,在大多数情况下,我的视图模型将是有效的,并且验证逻辑将保留在一个地方,并且只在领域模型中发生。这种方法的缺点是asp.net mvc 2验证将无法支持它。

你认为呢?

谢谢。

3个回答

2
微软企业库提供了一个基于泛型的“可插入验证”库。我不太喜欢它的工作方式,更不用说依赖其他EL组件的数量了,但仍然值得一看。
我绝不是这个领域的专家,但我坚信数据应该在您想要处理它之前进行验证,并且在提交到存储库之前始终进行验证。因此,您的验证逻辑最好放在业务逻辑层中。客户端验证虽然对用户很友好,但会使代码维护成为一场噩梦,并且还会导致代码重复,从而可能在后面引起问题。
在我看来,您的表示对象应该是DTO。当用户将数据提交回控制器(和BLL)时,您可以使用解析器将表示对象转换为业务对象,然后进行验证。
我建议阅读Rudy Lacovara的博客(也称愤怒的.NET开发人员)。他是一个非常谦虚的人,有很多关于这方面的好东西。
希望对您有所帮助。

1

0

我喜欢可插拔/可注入验证器的想法。这是我通常进行验证的方式(无论是WebForms、MVC、WPF等)。为什么?因为验证规则往往因场景和应用程序层而异。例如:您的视图模型可能具有某些验证规则,这是由于UI布局而不是领域或基础设施规则。如果您使规则和验证器可组合,则可以在每个层/场景中重复使用许多数据约束规则。

虽然我认为JavaScript验证可以使用户更快地完成操作,但我会对仅在VM中使用JavaScript持怀疑态度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接