我使用三层架构,以c#和sql server数据库作为数据源。根据DRY负责人的说法,验证应该只在一个地方完成,在我的情况下是前端数据访问层或数据库存储过程。
所以我想知道是否验证数据访问层中的存储过程参数还是将其留给存储过程本身?
答案 0 :(得分:6)
DRY
是一项重要原则,但defence in depth也是如此。
在验证输入时,必须确保安全 - 这应该在每个级别上完成(因此在DAL和存储过程中都是如此)。
对于验证业务逻辑的数据,这应该在您的业务逻辑层(BLL)中。
答案 1 :(得分:1)
如果您使用的是三层架构,我建议您使用ORM进行调查,例如Nhibernate或Linq to Entites。 ORM将为您提供更好的重构能力和可维护性(对我而言,维护是最重要的,因为根据我的经验,它可以在较长时间内提高质量)。
将验证放入用户界面是不明智的,因为在您的DAL(数据访问层)中保存您的安全比在您可以更容易地绕过(意外或故意)的UI中更安全。想想SQL注入。您应该对您的数据访问权限进行验证,而不是仅对您的用户界面进行验证,因为它很容易在您的用户界面上错过,并且很容易绕过作为恶意用户试图访问他们不允许访问的其他数据。
我认为可能在UI上进行可用性验证并在数据访问层中进行安全验证是有意义的。我确实喜欢在一个地方进行验证的DRY负责人,你仍然可以这样做。如果您制定了一组通用的规则,这些规则通过数据访问层和UI传播,那么您将拥有一个安全可用的系统(通过对数据输入的即时反馈)。另一种方法可能是对不同的层有不同的规则。例如,字段长度规则和数据输入模式可以是UI特定的。例如,DAL可以强制数据有效。这是在多个地方进行验证,但只要他们没有独立做同样的事情,我想你会没事的。这是设计应用程序时最难考虑的一个方面,因为验证是一个跨领域的问题,你如何做到这一点取决于你如何构建应用程序设计的其余部分。