保持验证逻辑在服务器端和客户端之间保持同步

时间:2008-09-02 14:16:32

标签: database architecture

在我的previous question中,大多数评论者同意在客户和客户端都有验证逻辑。服务器端是一件好事。

但是存在问题 - 您需要在数据库和客户端代码之间保持验证规则同步。

所以问题是我们如何处理它?

一种方法是使用ORM技术,现代ORM工具可以生成代码,在将其发送到服务器之前可以处理数据验证。

我有兴趣听取你的意见 您是否有某种标准流程来处理这个问题?或许你认为这根本不是问题? :)

编辑

伙计们,首先感谢您的回答。

明天我会在this case

中总结你的答案并更新问题的文字

4 个答案:

答案 0 :(得分:3)

如其他帖子的其中一个答案中所述,如果要保持图层分离,则没有好办法避免在每个图层中复制验证逻辑。如果你使用某些东西自动将它们绑在一起,你就会在层之间引入一种可能阻碍你前进的耦合。这可能是您必须手动跟踪事物的情况之一。

无论如何,你必须确保每一层都在进行自己的验证,因为你永远不知道该层是如何被访问的。无法保证您实施的所有图层始终保持在一起。

答案 1 :(得分:1)

我喜欢使用验证服务,它不一定关心要验证的数据的来源。当您进入有关将验证规则传输到客户端(即网页)的部分时,这可以通过几种不同的方式工作,但我认为最重要的方面是对实际验证规则具有单一权限。

例如,如果您的数据核心实体上有验证逻辑,例如通过Validate方法检查的ValidationRule对象的集合 - 这是一个非常典型的场景,那么我会通过这些方法向客户端(javascript)推广这些相同的规则转型。

在ASP.NET世界中(我能说的唯一一个)有几种方法可以做到这一点。我首选的方法是创建自定义验证器,将您的UI小部件与实体上的字段(及其所有验证规则)绑定在一起。这样做的好处是所有验证逻辑都可以捆绑到一个验证器中。缺点是您的验证消息将变得密集,因为验证规则都会立即进行测试。当然,可以通过让验证逻辑仅返回第一次失败等来减轻这种情况。

这个答案可能听起来有点模糊和不明确,但我想提出的两点是:

  1. 验证应尽可能接近输入数据的位置及其提交的位置。
  2. 在验证发生的地方应该使用相同的验证规则 - 如果客户端验证通过,那么它应该永远不会失败验证(预先保存业务规则,外键违规等)。

答案 2 :(得分:1)

某些框架提供了验证支持,可以使您的客户端和服务器验证保持同步。使用注释查看此Seam validation tutorial。这是一个很好的实现,很容易理解。

无论如何,如果你不想依赖框架,我认为很容易实现类似的东西。

答案 3 :(得分:0)

如果您使用的是ASP.Net,则可以使用许多验证控件。这些控件以非常通用的方式编写,这样它们中的大多数都会自动复制客户端和服务器之间的验证逻辑,即使您只在一个位置设置控件的选项。

您也可以自由地继承它们以创建其他特定于域的验证器,并且您可以在Web上获得第三方控件包,以便添加到基本控件。

即使您没有使用ASP.Net,也值得一看这是如何完成的。它将为您提供如何在您自己的平台上执行类似操作的想法。