在程序中验证用户输入的位置?

时间:2010-09-28 22:54:43

标签: architecture oop validation

假设我必须为一家小型诊所公司实施一项计划,该计划允许其用户(即医生)安排咨询,记录客户的病史等。因此,这可能是标准的3层应用程序:演示文稿,控制器和数据层(将连接到数据库)。

我看到了3种可能性:

  1. 我的第一个想法是将验证代码放在域层中。但是我觉得那时我可能会想要检查A类,然后检查使用A的B,然后使用B等的C检查。另一方面,它很好,因为它很容易单元化 - 测试验证逻辑。

  2. 还有第二种想法,就是说尽快验证用户输入的最佳位置,即可能在表示层(或在控制器中)。一般来说,这似乎是一个好主意。如果在Controller上,它也可能很容易进行单元测试。它还允许人们切换视图或数据层,并且仍然可以正常运行。

  3. 尝试将最有效的逻辑放在数据库本身上。这似乎是一个好主意,因为它强制执行没有数据破坏数据库。我看到的问题是,如果我想使用不同的数据存储库,我将不得不再次为新的数据验证逻辑。例如,在域层拥有这种逻辑就不会有这个问题。

  4. 你如何处理这个问题?

3 个答案:

答案 0 :(得分:9)

正如您所指出的,验证数据的位置不止一个。

还有几个级别的验证:

  1. 正确的格式和类型;存在所有必需值(例如,如果需要出生日期,请确保它出现并且是Date类型;如果它是String,请确保它符合预期的格式,例如'yyyy-MM-dd')
  2. 第1级加“业务正确性”:已完成的交易对您的业务规则有效(例如,“出生日期必须至少比今天早18年”)。
  3. 有一种思想流派认为你应该考虑所有这些:

    1. 验证客户端以确保为用户提供最佳体验。不要让他们等待往返服务器以找出问题所在。进行JavaScript验证,立即告诉他们1级有效性。
    2. 在服务器端再次验证,因为您的服务层可能没有用户界面。绑定并验证进入服务层的所有值。
    3. 执行所有2级验证,作为服务层中事务的一部分。从业务角度确保输入正确。
    4. 如果数据库由多个应用程序共享,则将业务逻辑放入约束,存储过程和触发器以确保数据完整性。
    5. 我不认为这些应该是“要么”决定。

答案 1 :(得分:1)

不要混淆“when”和“where”。

“何时”应尽可能早,可能由预设层触发。

“Where”应该接近域逻辑。

与此相关,例如可能意味着让表示层调用域逻辑提供的验证服务。

答案 2 :(得分:0)

您经常需要在多个层面进行验证:

  • 客户端层确保用户体验尽可能好。例如,避免输入10个字段,然后由于无效输入而不得不重新开始。
  • 在服务层,由于您不是100%确定客户端已处理该请求(可能是某人已将消息直接发送到服务层。
  • 在服务层,因为无法在客户端检查某些内容。

好消息是,某些技术允许您指定一次验证规则,它们将为客户端和服务器生成验证代码。见http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx 这有助于上面的前两种情况。