寻找减少视图模型和逻辑层中验证代码重复的方法

时间:2011-12-28 05:40:28

标签: asp.net-mvc-3

现在我们团队正在构建的应用程序使用内置的MVC属性和一些自制的属性来验证View Models。由于最佳实践设计原则,我们在逻辑层中放置了相同的规则。遗憾的是,这导致了验证码的重复。

至少在MVC3中,如果禁用JavaScript,这些相同的属性仍然会执行它们所要求的验证,因此将视图模型转换为DTO并要求逻辑层验证它不是一个选项,因为这个过程该框架已经完成了。

我没有发现以下SO帖子有任何帮助。我使用过MS Enterprise Library,但API并不适合我们的团队。

Good practices for avoiding validation logic duplication when working with both domain objects and view models in ASP.NET MVC

我认为最好的方法是将验证属性在运行时绑定到特定属性,并让依赖注入容器执行此操作。这是可能的还是我们可以采取不同的方法?

2 个答案:

答案 0 :(得分:1)

您要求在此处执行多种验证类型。 您需要客户端验证(似乎)和其他一些业务验证层。

如果是这种情况,我认为唯一的选择是:

  1. 复制代码(我知道我列出的选项) 1A。在对象上使用数据注释进行客户端验证。然而,您定义了业务层验证,并将其作为最终检查分开。例如,如果您使用实体框架的流畅API,那么这是一条标准路线。
  2. 客户端验证只是 - 客户端的帮助。域验证将在保存时发生。理想情况下,这是更强大的方法,但是当您的域对象与视图模型上的属性名称不匹配时,它们并不友好,因此您需要映射域错误以查看模型属性错误,这些错误通常不是太糟糕但可以获得iffy
  3. 实现IValidteableObject(并取消客户端验证)。然后从逻辑层和模型绑定器调用此验证逻辑。
  4. 您可以为验证注入代码,但它并不漂亮,我不确定它是否可以在MVC验证路径之外重用。
  5. 除此之外可能还有其他方法,但这些是我看到的主要选项。

答案 1 :(得分:1)

一种看待它的方法是:如果你的api是你的mvc应用程序,并且你正在执行业务规则已经完成验证,你可以假设它们是有效的。它是输入验证,当然是与您的域相关的但是......如果您改变思维方式,您的域期望有效数据并假设您在使用业务规则之前完成了您的作业。