9

我现在感觉有点矛盾。我有一个使用 Stripes 作为 MVC 框架和 Spring/Hibernate 作为后端的 Web 应用程序。我的 MVC 层中有一个帐户注册方法,需要以下验证:

  • 用户名尚未被占用
  • 提供的电子邮件地址尚未与其他帐户关联

我在 Stripes(MVC 层)中有一个验证方法来检查这两种情况,但想知道我的服务层是否应该重复这些检查?如果服务层接口作为 Web 服务公开,那么我认为验证将是一个好主意,但如果它仅用于 Web 应用程序的上下文中,是否需要它?

编辑:我不打算复制验证代码 - 我的意思是在两个地方复制验证方法调用。

我认为我的选择是:

  1. 复制 MVC 和服务层中的验证调用
  2. 仅在 MVC 层执行此验证
  3. 仅在服务层中执行此验证。

这里的最佳做法是什么?我正在寻找关于我应该选择哪个选项以及为什么选择的建议/意见。

请注意,注册表单的输入字段有简单的验证检查(如检查空白),我认为这些应该仅由 MVC 验证处理;我只关心更复杂的验证。

4

4 回答 4

5

不要重复代码。使用JSR303 Bean 验证,因此您可以在应用程序的所有层中使用相同的验证逻辑。

Hibernate Validator(一个独立于 Hibernate ORM 的项目)提供了这个接口的参考实现。它使用起来非常简单,您可以很快上手

于 2010-06-29T13:54:59.260 回答
3

在我看来,您应该区分两种验证:

  • 格式数据验证:应该在表示层(在您的情况下为 MVC)中进行验证。通常在客户端和服务器端
  • 业务数据验证:应该在服务层进行验证

在您的情况下,您的验证与业务规则相关,因此我将它们仅放在服务层中。此外,如果您在两个层中重复验证,您将进行两次相同的查询,从而降低应用程序的性能。

于 2010-06-29T15:37:03.570 回答
2

安妮,

好问题,我在很多场合都问过自己同样的问题。这就是我最终得到的(直到现在)。

最纯粹(但乏味)的方法是在两个层中调用验证逻辑。务实的方法可能是仅在网络领域(例如您的控制器)中调用它。

我认为没有任何答案可以结束所有讨论。我认为这取决于您的项目的上下文。如果项目规模不大(就人员和代码库的大小而言),并且您确信调用您的服务 API 的其他人不会开发大量代码(在某种程度上您将无法监督),那么只在 web 层进行验证就足够了。

但是,如果您期望有很多客户端,您可能需要更高级别的安全性。当我在这里说安全性时,我将其称为您需要的一致性保证级别。如果该级别很高,则无法解决:您必须在服务(为了安全)和 Web 层(主要是为了能够为最终用户提供可接受的体验)中都这样做。

因此,这里的关键驱动因素是安全性以及您真正需要多少安全性。如果你需要很多,你会选择“纯粹主义”的方法。如果您的应用程序不能准确地做出涉及生死攸关的决定,那么您将采用务实的方法。

于 2010-06-29T18:35:14.390 回答
1
  1. 理想情况下,在两个层中都进行验证,因为您的服务层可能与当前 mvc 层以外的客户端一起使用

  2. 在两个地方重用验证机制(例如 Bean 验证)

于 2010-06-29T13:57:54.493 回答