如何在MVC和WCF中实现客户端验证而不重复逻辑?

3
我可能在寻找一个不存在的圣杯,但值得一试。首先,这里是我们架构的快速概述:
- 数据访问:通过Entity Framework与SQL Server交互的存储库类 - 业务逻辑:管理器类调用数据层并将数据映射到领域模型 - 领域模型:表示我们领域的POCO - 服务库/服务门面:公开POCO的CRUD操作 - 表示层:ASP.NET MVC(v2,但如果需要,可以移动到v3 - 我们的项目还处于早期阶段)
我们要解决的问题是如何自动创建客户端验证来处理基本问题,例如必填字段、最小和最大长度、数字范围等 - 只是您的基本第一道防线。
如果我们在领域模型POCO上使用DataAnnotations(听起来很有吸引力),我们可以让jQuery的无侵入式验证为我们工作。为了使其工作,我们必须在服务和表示层中都引用领域模型库,因为DataAnnotations不会通过WCF传递。不幸的是,我们需要在几个应用程序中重用WCF服务,如果我们采用这种方法,我们可能会创建版本锁定问题。
因此,我们不能在服务边界的两侧引用领域模型,也不想将验证规则的定义移动到表示层,因为未来的应用程序可能会消耗相同的服务,并且那里也需要验证。
这让我们寻找另一种传递定义在领域模型中的验证规则(或验证元数据,如果您愿意)的方法,以通过WCF将其传递到客户端应用程序。
我知道这听起来像我们想要拥有蛋糕并吃掉它。如果没有合理的解决方案,我们将咬紧牙关复制验证逻辑。我认为这比紧密耦合我们的应用程序层更可取。
鉴于上述情况,您如何处理客户端验证并仍然避免重复逻辑?

只需拥有一些元资源(xml/json),以声明方式说明验证规则。然后编写一个可扩展的C#和JS处理程序来处理这些规则。 - Raynos
嗨Rick,由于您已经在下面的答案中发表了评论,您能否发布一些解决此问题的示例代码。我也遇到了这个问题。如果您可以发布一些示例代码,那么我就可以解决我的问题。谢谢。 - Karan Patel
@KaranPatel 我已经离开了实施元数据解决方案的公司,如果不付出很多努力,我无法重建这个想法。我会说自那时以来,我采取的方法是在MVC端为服务引用中的类型创建部分类,然后将DataAnnotations应用于该类型的成员。这种方法非常有效,几乎没有重复。 - Rick Liddle
好的,没问题Rick。谢谢您的快速回复和提示 :) - Karan Patel
3个回答

2
WCF不处理客户端验证,因为它无法知道服务另一端的客户端能力。如果您想要做类似的事情,您需要:

  1. 在WCF服务中编写额外的函数,以便为客户端提供一种请求以某种格式获取验证规则的方式,然后使用一些自定义代码来实现它们。

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

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


我不打算使用WCF进行验证。你上面提到的第一点是我希望找到现有方法来实现的简单描述。DataAnnotations是我希望利用的功能,因为MVC中的默认模型绑定器会读取这些属性并自动创建jQuery验证控件。看起来没有内置的解决方案,所以我们将考虑编写自己的模型绑定器来为我们完成这项工作。感谢您的建议。 - Rick Liddle
我已经初步完成了这个项目,并且它运行顺畅。简而言之,客户端可以调用WCF服务上的方法,返回指定类型属性的描述以及验证这些属性的元数据。MVC应用程序中的自定义验证对象被注册以执行元数据和验证任务。明天我会整理一个详细的概述,包括代码示例,并在此发布供将来参考。再次感谢。- Rick - Rick Liddle
Rick,如果你能够发布一些你是如何完成这个的示例代码,那就太好了。我和你一样也遇到了同样的问题... - sagesky36

1

就像我回复 @Robotsushi 的那样,那正是我们正在尝试做的,但是我们设计中的服务层会阻止它。不过,我确实感谢提供的链接和信息。 - Rick Liddle

0

这正是我想做的事情,但由于属性不会随着使用 WCF 的类一起序列化,所以我无法实现。 - Rick Liddle

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