2009-07-29 63 views
0

假设我设计了这样的体系结构 - 应用程序由模块组成,模块使用特定于域的实用程序来执行对模型或数据库的更改。哪个'层'负责验证数据

一个例子,一个注册模块,它显示表单,接受输入,然后使用一个注册实用程序来执行调用来插入用户信息的DB。谁负责执行数据验证?

1)的模块,因为它是“上位”传递的数据下降到实用 2)该实用程序,这种方式没有可疑数据将永远通过 3)同时获得应有全面的数据验证 4)一些其他安排

想法?意见?

回答

5

任何使用数据的组件都负责验证数据的目的。

例如:服务层的某些部分可能会验证输入字段是否为有效的电子邮件地址,因为这就是业务规则的要求。虽然数据层可能会验证数据不超过特定长度,因为这是数据库列中最大的数据,但它并不特别在意它是否是电子邮件地址。

它也应该在允许重复使用的位置。因此(在MVC中)上面的“有效的电子邮件”验证不会进入控制器或视图,因为输入到这个业务逻辑可能发生在多个控制器/视图中,并且这需要重复验证逻辑。

0

验证应尽可能接近模型。由于该实用程序更改了模型,因此它不应该信任数据模块发送它的有效性。这样,重复使用该实用程序会更安全(您可以在多个模块中使用它,而无需复制验证代码)。另一方面,将验证放置在与用户更近的模块上会带来更好的体验(更快 - 客户端验证等)。 因此,在我看来,最好的方法是将验证放入您的实用程序中,稍后如果有资源通过在模块中添加另一层验证来增强用户体验。

0

应尽快验证数据 - 即从输入读取数据(如用户输入)和验证数据时的最小距离。这样做的实际原因是它更容易查看验证码。在MVC中,我会说它应该进入'控制器',假设控制器是你读取所有输入值的位置(然后控制器将验证值传递给模型,当你这样做时)。

也就是说,验证代码中可能会有一些东西可以共享,您可以编写自己的代码进行验证。

0

验证的地方取决于应用程序内部的API暴露程度以及设计中验证发生的位置(即谁拥有验证问题)。

要设置一个有效的电子邮件地址,接受数据的控制器可能应该这样做,因为所有其他代码都会期待有效的电子邮件地址。另一方面,验证数据是否正确转义以进行数据库处理属于模型内部的深处,正好在实际的SQL处理之上。