如何在不重复逻辑的情况下使用MVC和WCF进行客户端验证?

时间:2011-06-03 20:10:43

标签: jquery asp.net-mvc wcf validation

我可能在这里寻找一个不存在的圣杯,但它值得一试。对于初学者,这里是我们的架构的快速概述:

  • 数据访问:通过SQL Server与SQL Server交互的存储库类 实体框架
  • 业务逻辑:Manager类调用数据层并将数据映射到域模型
  • 域模型:代表我们域名的POCO
  • 服务资料库/服务门面:公开POCO的CRUD操作
  • 演示文稿:ASP.NET MVC(v2,但如果需要可以移至v3 - 我们的项目仍处于早期阶段)

我们要解决的问题是如何自动创建客户端验证来处理基本问题,如必填字段,最小和最大长度,数值范围等。 - 只是您的基本第一道防线东西。

如果我们在域模型POCO上使用DataAnnotations(这听起来很有吸引力),我们可以让jQuery的不引人注目的验证为我们工作。为了使它工作,我们必须在Service层和Presentation层中引用Domain Model库,因为DataAnnotations不会通过WCF传递。不幸的是,我们需要在多个应用程序中重用WCF服务,如果我们采用这种方式,我们可能会创建版本锁定问题。

因此我们无法在服务边界的两侧引用域模型,并且我们不希望将验证规则的定义移动到表示层,因为未来的应用程序可能会使用相同的服务并且验证将是那里也需要。

这使我们找到另一种方法将验证规则(或验证元数据,如果您愿意)通过WCF的域模型定义到客户端应用程序。

我知道这听起来好像我们想吃蛋糕并吃它。如果没有合理的解决方案,我们会咬紧牙关并重复验证逻辑。我认为这比紧密耦合我们的应用程序层更为可取。

鉴于上述情况,您将如何处理客户端验证并仍然避免重复逻辑?

修改

感谢到目前为止的想法。还有一个方面,我意识到在谈论DataAnnotations时我忘了包括:我们研究了使用反射来获取注释并通过方法调用将它们返回给单独的服务,但这不起作用,因为它们不是标记为Serializable,因此无法通过WCF返回。

3 个答案:

答案 0 :(得分:2)

WCF不处理客户端验证,因为它无法知道服务另一端的客户端功能。如果你想做这样的事情,你需要:

  1. 将额外的功能写入您的WCF服务,为您的客户提供一种以某种格式请求验证规则的方法,然后使用一些自定义代码实现它们。

  2. 您的客户需要实现自己的验证逻辑。

  3. 如果WCF可以像你想要的那样将验证规则传递给客户端,那将是一个杀手级功能,但它不能。 :(

答案 1 :(得分:1)

我前几天给另一个问题提供的答案可以帮到你:

What is better way to validate business rules in ASP.NET MVC application with 3 layer architecture?

答案 2 :(得分:0)