假设我必须为一家小型诊所公司实施一项计划,该计划允许其用户(即医生)安排咨询,记录客户的病史等。因此,这可能是标准的3层应用程序:演示文稿,控制器和数据层(将连接到数据库)。
我看到了3种可能性:
我的第一个想法是将验证代码放在域层中。但是我觉得那时我可能会想要检查A类,然后检查使用A的B,然后使用B等的C检查。另一方面,它很好,因为它很容易单元化 - 测试验证逻辑。
还有第二种想法,就是说尽快验证用户输入的最佳位置,即可能在表示层(或在控制器中)。一般来说,这似乎是一个好主意。如果在Controller上,它也可能很容易进行单元测试。它还允许人们切换视图或数据层,并且仍然可以正常运行。
尝试将最有效的逻辑放在数据库本身上。这似乎是一个好主意,因为它强制执行没有数据破坏数据库。我看到的问题是,如果我想使用不同的数据存储库,我将不得不再次为新的数据验证逻辑。例如,在域层拥有这种逻辑就不会有这个问题。
你如何处理这个问题?
答案 0 :(得分:9)
正如您所指出的,验证数据的位置不止一个。
还有几个级别的验证:
有一种思想流派认为你应该考虑所有这些:
我不认为这些应该是“要么”决定。
答案 1 :(得分:1)
不要混淆“when”和“where”。
“何时”应尽可能早,可能由预设层触发。
“Where”应该接近域逻辑。
与此相关,例如可能意味着让表示层调用域逻辑提供的验证服务。
答案 2 :(得分:0)
您经常需要在多个层面进行验证:
好消息是,某些技术允许您指定一次验证规则,它们将为客户端和服务器生成验证代码。见http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx 这有助于上面的前两种情况。