Validation 三层体系结构中的验证

Validation 三层体系结构中的验证,validation,3-tier,Validation,3 Tier,假设存在Employee类,业务需求之一是EmployeeName变得唯一。现在使用3层架构 第1层:演示文稿 第2层:域模型+数据服务类业务逻辑层 第3层:数据访问类+存储过程数据访问层 既然上面的要求是一项业务要求,那么您认为将此规则放在哪里最合适 选项1:数据库中的唯一键约束 选项2:在业务层中检查数据服务类中的条件,以便将业务逻辑封装在该层中,而不管在所有三层中使用的是哪个数据层?。然而,重要的是验证需求=实际数据约束因层而异这一事实。这是因为不同的上下文和设计的系统边界 在您的示例中,

假设存在Employee类,业务需求之一是EmployeeName变得唯一。现在使用3层架构

第1层:演示文稿 第2层:域模型+数据服务类业务逻辑层 第3层:数据访问类+存储过程数据访问层

既然上面的要求是一项业务要求,那么您认为将此规则放在哪里最合适

选项1:数据库中的唯一键约束


选项2:在业务层中检查数据服务类中的条件,以便将业务逻辑封装在该层中,而不管在所有三层中使用的是哪个数据层?

。然而,重要的是验证需求=实际数据约束因层而异这一事实。这是因为不同的上下文和设计的系统边界

在您的示例中,验证可能如下所示:

第1层:表示层-验证名称是否已输入,即用户界面中的文本框不是空的,最多可包含100个字符。 第2层:业务逻辑层-如上所述进行验证,加上它由至少两个由空格分隔的令牌组成,加上名字和姓氏是一个真实的名字和姓氏对照一些名字数据库进行的检查。 第3层:数据层-数据库完整性约束,即相应字段不为空且最大长度为100个字符。 结果是,从数据库的角度来看,您检查了合理数量的约束以保持系统的一致性,但不要假设什么是高阶逻辑。事实上,您不会不必要地限制将来的更改。从业务逻辑的角度来看,有一整套强制的约束。最后,从表示逻辑的角度来看,您不会过度验证:只执行简单的验证以减少业务逻辑的不必要通信量,可能会防止业务逻辑层出现异常,而不会复制任何更复杂的内容

根据经验,在业务逻辑层的外观上提供详细的验证始终是最佳实践。这是潜在不受信任的表示层和/或第三方(可能只是另一个公司系统API使用者)连接的地方

此外,请对您在问题中概述的选项提出一些具体意见:

选项1:数据库中的唯一键约束

不仅如此。从数据正确性的角度来看,这是可行的,但仅仅依赖于数据库约束,就失去了语义,很难提供一条人类可以理解的错误消息。此外,每一个错误的输入都会传到数据库,为DoS攻击打开一个潜在的漏洞,这可能会损害整个技术堆栈

选项2:在业务层中检查数据服务类中的条件,以便在该层中封装业务逻辑,而不管使用的是哪个数据层


是的,见上文。但是,不要通过在表示层中至少避免基本的、易于评估的验证来损害安全性、性能和用户体验。

在所有三个层中。然而,重要的是验证需求=实际数据约束因层而异这一事实。这是因为不同的上下文和设计的系统边界

在您的示例中,验证可能如下所示:

第1层:表示层-验证名称是否已输入,即用户界面中的文本框不是空的,最多可包含100个字符。 第2层:业务逻辑层-如上所述进行验证,加上它由至少两个由空格分隔的令牌组成,加上名字和姓氏是一个真实的名字和姓氏对照一些名字数据库进行的检查。 第3层:数据层-数据库完整性约束,即相应字段不为空且最大长度为100个字符。 结果是,从数据库的角度来看,您检查了合理数量的约束以保持系统的一致性,但不要假设什么是高阶逻辑。事实上,您不会不必要地限制将来的更改。从业务逻辑的角度来看,有一整套强制的约束。最后,从表示逻辑的角度来看,您不会过度验证:只执行简单的验证以减少业务逻辑的不必要通信量,可能会防止业务逻辑层出现异常,而不会复制任何更复杂的内容

根据经验,在业务逻辑层的外观上提供详细的验证始终是最佳实践。这是潜在不受信任的表示层和/或第三方(可能只是另一个公司系统API使用者)连接的地方

此外,还将对您选择的选项提出一些具体意见 在你的问题中:

选项1:数据库中的唯一键约束

不仅如此。从数据正确性的角度来看,这是可行的,但仅仅依赖于数据库约束,就失去了语义,很难提供一条人类可以理解的错误消息。此外,每一个错误的输入都会传到数据库,为DoS攻击打开一个潜在的漏洞,这可能会损害整个技术堆栈

选项2:在业务层中检查数据服务类中的条件,以便在该层中封装业务逻辑,而不管使用的是哪个数据层


是的,见上文。但是,不要在表示层中至少避免基本的、易于评估的验证,从而损害安全性、性能和用户体验。

@Downvoter感谢您的downvote。有什么解释吗?非常感谢你花时间写了这么长的描述性回答,这对我真的很有用。但是,在每次插入/更新之前添加这个额外的数据库流量以检查名称重复是否可以?我还有两个问题,您认为理想情况下应该在数据库中放置哪些常见约束?另外,关于表示层验证和业务层验证之间的关系,您认为所有基于逻辑的验证(例如出生日期不应超过某个日期)都应该放在业务层?感谢您的支持,我的帐户不能再发布任何新问题,我真的不明白我的问题到底出了什么问题,竟然得到了两张反对票!1不必担心任何额外的数据库流量,只要您在表示层执行简单的验证,就可以有效地防止无效数据进入业务逻辑层。数据库中的2个约束:考虑技术约束以保持数据一致性。3所有验证应在业务层中进行,加上部分或全部在表示层中重复。4.我不懂生日的例子。2.你能给我举一些常见的例子让我更清楚一些吗。4例如,出生日期不能在2015年,因为我们仍然生活在2014年,或者更严格的例子是,如果员工至少应该是18岁,那么出生日期必须在今天之前减去18岁,等等@Downvoter感谢您的downvote。有什么解释吗?非常感谢你花时间写了这么长的描述性回答,这对我真的很有用。但是,在每次插入/更新之前添加这个额外的数据库流量以检查名称重复是否可以?我还有两个问题,您认为理想情况下应该在数据库中放置哪些常见约束?另外,关于表示层验证和业务层验证之间的关系,您认为所有基于逻辑的验证(例如出生日期不应超过某个日期)都应该放在业务层?感谢您的支持,我的帐户不能再发布任何新问题,我真的不明白我的问题到底出了什么问题,竟然得到了两张反对票!1不必担心任何额外的数据库流量,只要您在表示层执行简单的验证,就可以有效地防止无效数据进入业务逻辑层。数据库中的2个约束:考虑技术约束以保持数据一致性。3所有验证应在业务层中进行,加上部分或全部在表示层中重复。4.我不懂生日的例子。2.你能给我举一些常见的例子让我更清楚一些吗。4例如,出生日期不能在2015年,因为我们仍然生活在2014年,或者更严格的例子是,如果员工至少应该是18岁,那么出生日期必须在今天之前减去18岁,等等。