您在哪里进行验证?

2024-03-20

希望您会看到我在下面的场景中描述的问题。如果不清楚,请告诉我。

您的应用程序分为三层,

  • 前端UI层,可以是asp.net webform,或者window(用于编辑Person数据)
  • 中间层业务服务层,编译成dll(PersonServices)
  • 数据访问层,编译成dll(PersonRepository)

在我的前端,我想创建一个新的 Person 对象,根据用户在 UI 中输入的内容设置一些属性,例如 FirstName、LastName,然后调用 PersonServices.AddPerson,传递新创建的 Person。 (AddPerson 不必是静态的,这只是为了简单起见,无论如何,AddPerson 最终都会调用存储库的 AddPerson,然后它将保留数据。)

现在我想听听你的意见是验证。在此过程中的某个地方,需要验证新创建的 Person。您可以在客户端执行此操作,这很简单,但是如果我想验证 PersonServices.AddPerson 方法中的 Person 该怎么办?这将确保我想要保存的任何人都得到验证,并消除对执行工作的 UI 层的任何依赖。或者,可以在 UI 和业务服务器层中进行验证。到目前为止听起来不错吧?

因此,为了简单起见,我将更新 PersonService.AddPerson 方法来执行以下验证检查 - 检查 FirstName 和 LastName 是否不为空 - 确保我的存储库中尚不存在这个新人

如果所有验证通过且 Person 被持久化,则此方法将返回 True;如果验证失败或 Person 未持久化,则返回 False。

但 AddPerson 返回的布尔值不足以让我在 UI 层向用户提供保存过程失败的明确原因。那么孤独的开发者该怎么办呢?最终,我希望 AddPerson 方法能够确保其要保存的内容有效,如果不是,则能够向我的 UI 层传达其无效的原因。

为了让你的果汁流动起来,解决这个问题的一些方法可能是:(在我看来,其中一些解决方案很糟糕,但我只是把它们放在那里,以便你了解我正在尝试解决的问题)

  • AddPerson 不返回布尔值,而是返回一个 int (即 0 = 成功,非零等于失败,数字表示失败的原因。

  • 在 AddPerson 中,验证失败时抛出自定义异常。每种类型的自定义异常都有其自己的错误消息。此外,每个自定义异常都足够独特,足以在 UI 层中捕获

  • 让 AddPerson 返回某种自定义类,该类具有指示验证是否通过或失败的属性,如果失败,原因是什么

  • 不确定这是否可以在 VB 或 C# 中完成,但将某种属性附加到 Person 及其基础属性。这个“附加”属性可能包含验证信息之类的内容

  • 在此插入您的想法或模式

  • 也许这里还有另一个

对于这个冗长的问题,我深表歉意,但我非常想听听您对此的看法。

Thanks!


多层验证与多层应用程序配合良好。

UI 本身可以进行最简单、最快的检查(是否存在所有必填字段,是否使用适当的字符集等),以便在用户输入错误时立即提供反馈。

然而,业务逻辑应该承担大部分的验证责任……这一次,如果这是“重复的”,也就是说,如果业务层重新检查了应该已经在 UI 中检查过的内容,那么这一次就不是问题了—— BL 应该检查所有业务规则(这会双重检查 UI 的正确性,启用多个不同的 UI 客户端,这些客户端在检查中可能并不完美——例如,智能手机上的特殊客户端可能没有良好的 javascript,等等——还有一点,防范恶意黑客攻击的客户端)。

当业务逻辑将“已验证”的数据保存到数据库时,that层应该执行自己的检查——数据库擅长这一点,而且,不要担心一些重复——数据库的工作是强制数据完整性(有一天你可能需要不同的方式向它提供数据,例如一个“批量加载器”,用于从另一个源导入多个人员,确保所有这些加载数据的方法始终遵守数据完整性规则是关键);某些规则(例如唯一性和引用完整性)实际上最好在数据库中强制执行,特别是出于性能原因。

当数据库向业务层返回错误消息(未插入数据,因为约束 X 将被违反)时,业务层的工作是用业务术语重新解释该错误,并将结果提供给 UI 以通知用户;当然,BL 也必须类似地向 UI 提供有关违反业务规则的清晰完整的信息,再次显示给用户。

因此,“自定义对象”显然是“唯一的出路”(例如,在某些情况下,我只是将其设为 JSON 对象)。当数据库拒绝持久化时,保留 Person 对象(以维持其“验证问题”属性)看起来并不是一种尖锐而简单的技术,所以我不太看重这个选项;但如果您需要它(例如,启用“再次告诉我出了什么问题”功能,也许客户端在响应准备好之前离开并且需要稍后顺利重新启动;或者,此类对象的列表以供以后审核等) ,那么“自定义验证失败对象”可以also被追加到该列表中...但这是一个“次要问题”,主要是 BL 用这样的对象响应 UI(如果插入在事实成功)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您在哪里进行验证? 的相关文章

随机推荐

  • 身份验证时出现 umbraco 公共访问错误

    我在 Umbraco 7 中的公共访问方面遇到问题 我使用自定义会员资格提供商通过 CRM 数据库对用户进行身份验证 我设置了一条规则来允许访问仅经过身份验证的 前端 用户我使用自定义角色提供程序来定义经过身份验证的用户具有访客角色 如果未
  • 未找到 GoogleWebAuthorizationBroker

    我正在学习 C 为 Windows Phone 开发 并且我正在尝试验证我的用户进入 Google 帐户 我使用这个代码 https developers google com api client library dotnet guide
  • 如何使用 JavaScript 将非英语字符转换为英语

    我有一个 C 函数 它将所有非英语字符转换为给定文本的正确字符 就像下面这样 public static string convertString string phrase int maxLength 100 string str phr
  • 使用 pandas 删除 Excel 中的标题行

    我有一个带有合并标题的 Excel 文件 我使用 pandas 将其读取为数据框 之后看起来像这样pd read excel Unnamed 0 Pair Unnamed 1 Type Unnamed 23 cabinet name gro
  • 设计时 XAML 的默认值

    我有一个绑定的TextBlock XAML
  • C 复数和 printf

    如何打印 使用 printf 复数 例如 如果我有以下代码 include
  • 针对一组测试最小汉明距离的算法?

    我想做一件相对简单的事情 给定一个查询号码Q 查询距离d 和一组数字S 判断是否S包含any汉明距离小于或等于的数字d 最简单的解决方案就是使S一个列表并迭代它 计算距离 如果计算出的距离小于或等于 d 则退出返回TRUE 但考虑到我想做的
  • 在python中打印对象/实例名称

    我想知道是否有一种方法可以将 python 中的对象名称打印为字符串 例如 我希望能够说 ENEMY1 还剩 2 马力 或者 ENEMY2 还剩 4 马力 有办法做到这一点吗 class badguy def init self self
  • 更精确的Thread.Sleep

    我该如何做 Thread Sleep 10 4166667 好吧 我现在明白了 睡眠不是一条出路 所以我使用计时器 但计时器也是以毫秒为单位 我需要更精确 有纳秒精度的计时器吗 那么您希望您的线程恰好在该时间休眠然后恢复 忘掉它 该参数告诉
  • Android自定义权限-Marshmallow

    背景 从历史上看 Android 自定义权限已经一团糟 https code google com p android issues detail id 65864 and 取决于安装顺序 https code google com p a
  • Hibernate 的二级缓存是否/可以用于 COUNT() 操作?

    当使用 Hibernate 和 Ehcache 作为二级缓存 2LC 实现时 在使用 WHERE 子句执行 COUNT 操作时是否 或可以 使用此缓存 用 SQL 术语来说 我正在执行的查询是SELECT COUNT id FROM tab
  • 以编程方式选择 DataGridView 的一行

    在我的表单应用程序中 有一个 buttonNEW 选择NewIndexRow of DataGridView我想用这个按钮更改 datagridview 的索引 private void buttonNew Click object sen
  • 将变量向上舍入到下一个最接近的 X 倍数

    我正在寻找一种方法将数字四舍五入到下一个最接近的 250 倍数 例如 如果我有以下 JS var containerHeight container height 我们假设 containerHeight 的值是 680px 我想要一种向上
  • 如何设置 AG-GRID 列垂直边框的样式

    我希望我的 AG Grid 列具有垂直边框 默认情况下 网格行具有水平边框 我希望它模仿常规 Excel 电子表格的外观和感觉 我尝试在列定义中使用单元格样式 如下所示 this columnDefs headerName Test cel
  • 我可以通过编程方式向 WPF 数据网格添加一行吗?

    我只想添加一个新行 我的数据源位于需要进行一些处理的对象中 我需要像下面这样的 wpf 数据网格 DataRow row dataTable NewRow foreach NavItem item in record Items row i
  • 如何将数据绑定到非静态类上的静态属性?

    In my ViewModel类我有一个静态属性AllSupport但我不知道如何正确绑定它 ListView 已绑定到 ObservableCollectionAllEffects具有AllSupport静态属性 我用过这个
  • 在 PHP 邮件函数中设置 $headers 数组时遇到问题

    当我将 headers 数组指定为时 我无法通过 PHP 邮件函数发送电子邮件 headers array From gt email protected cdn cgi l email protection Content type gt
  • 悬停时模糊整个背景

    所以我的首页上有一些项目 其中显示了一些动漫 我想做的是 当你将鼠标悬停在第一个节目 Hunter X Hunter 上时 我希望页面上的所有其他内容 不包括悬停的内容 都变得模糊 我环顾四周 看到了一些例子 但我觉得我的情况有点不同 首页
  • PHP REST API 中的选项

    我正在用 PHP 编写 REST API 但找不到任何解释如何使用 OPTIONS 的资源 它似乎是 REST API 的重要组成部分 这就是我发现的内容 谁能解释 OPTIONS 应该包含什么以及它应该如何格式化 提前致谢 HTTP OP
  • 您在哪里进行验证?

    希望您会看到我在下面的场景中描述的问题 如果不清楚 请告诉我 您的应用程序分为三层 前端UI层 可以是asp net webform 或者window 用于编辑Person数据 中间层业务服务层 编译成dll PersonServices