【问题标题】:Validation in 3-Tier Architecture3 层架构中的验证
【发布时间】:2014-01-31 04:06:26
【问题描述】:

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

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

既然上面的需求是业务需求,那么你认为把这条规则放在哪里最好?

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

选项2:在业务层的Data Service类中检查条件,以保持业务逻辑封装在该层中而不管正在使用的数据层吗?

【问题讨论】:

    标签: validation 3-tier


    【解决方案1】:

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

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

    • 第 1 层:表示层 - 验证名称是否已输入,即用户界面中的文本框不为空,并且最多包含 100 个字符。
    • 第 2 层:业务逻辑层 - 如上验证,加上它包含至少两个由空格分隔的标记,加上名字和姓氏是真实的名字和姓氏(检查某些名称数据库)。李>
    • 第 3 层:数据层 - 相应字段不为空且最大长度为 100 个字符的数据库完整性约束。

    结果是,从数据库的角度来看,您检查合理数量的约束以保持系统一致,但不要假设高阶逻辑是什么问题。事实上,您不会不必要地限制未来的变化。从业务逻辑的角度来看,有一套完整的约束被强制执行。最后,从表示逻辑的角度来看,您不要过度验证:只执行简单的验证以减少对业务逻辑的不必要流量,可能防止业务逻辑层出现异常,而不是重复任何内容更复杂。

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

    此外,您在问题中概述的选项的一些特定 cmets:

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

    不仅如此。从数据正确性的角度来看,它会起作用,但仅依靠数据库约束,您将失去语义,并且难以提供人类可以理解的错误消息。此外,每一个错误的输入都会传递到数据库,从而为 DoS 攻击打开一个潜在的漏洞,这可能会损害整个技术堆栈。

    选项2:在业务层的Data Service类中检查条件,以保持业务逻辑封装在该层中而不管正在使用的数据层吗?

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

    【讨论】:

    • @Downvoter 感谢您的反对。请解释一下?
    • 非常感谢您花时间写下这个长长的描述性答案,它对我非常有用。但是可以在每次插入/更新之前添加这个额外的数据库流量来检查名称重复吗?我还有几个问题,您认为理想情况下应该在数据库中放置什么样的常见约束?还有关于表示层验证和业务层验证之间的关系,您认为所有基于逻辑的验证(例如不应超过某个日期的出生日期)都应该放在业务层?
    • 感谢投反对票的人,我的帐户不能再发布任何新问题了,我真的不明白我的问题有什么问题值得投 2 票!
    • 1) 不用担心额外的数据库流量,只要在表现层做简单的校验,有效防止无效数据进入业务逻辑层。 2) 数据库中的约束:考虑“技术”约束以保持数据一致。 3)所有验证都应在业务层中,加上(部分或全部)在表示层中重复。 4)我不明白生日的例子。
    • 2) 能否请您给我一些常见的例子,以使其更清楚。 4)例如出生日期不能在 2015 年,因为我们仍然生活在 2014 年,或者更严格的例子是员工应该至少 18 岁,那么出生日期必须在今天之前减去 18 岁等等。跨度>
    猜你喜欢
    • 2011-07-30
    • 2011-11-26
    • 2011-09-30
    • 2010-12-09
    • 2012-11-13
    • 1970-01-01
    • 2016-02-11
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多