为什么在 UI 中使用 DataTable 是错误的?

2023-12-26

我是初学者。我发现很难理解这里的一个概念。

有人告诉我不应该在 UI 级别使用 DataTable。

请帮助我理解这个概念。

解决方案:

MyApp.Data
MyApp.Logic
MyApp.Web

MyApp.Web 引用 MyApp.Logic,MyApp.Logic 引用 MyApp.Data。

在我的应用程序中,我想做的只是通过表名绑定 gridview,该表名是从下拉列表中选择的。然而,有数百张甚至更多的桌子。这里的目的只是向用户显示数据(通过分页)。

所以项目 MyApp.Data 上的类“Get_Data”有一个函数:

public static DataTable Get_DataTable_By_Name(string Table_Name)
{
    //Check and santize the table name for possible SQL injection attack.
    //SELECT FROM DATABASE TABLE.
    return DataTable;
}

从 MyApp.Logic,我只是将数据表从 MyApp.Data 层传递到 MyApp.Web。然后gridview就被绑定了,一切都在这里工作了。

那么我在这里做错了什么?在 UI 级别拥有数据表真的很糟糕吗?为什么这是一个糟糕的设计?


认为 UI 创建/加载/使用数据表是不好的做法的想法源于这样的想法:最好将应用程序拆分为专门的层,最常见的拆分是 3 层:

第 1 层是数据层,负责与数据库通信并填充域对象,域对象通常在第 2 层中定义,该层还保存应用程序的业务逻辑。

我所说的域对象是指代表真实事物的类,例如客户、银行帐户、酒店房间等。 我所说的业务逻辑是指在事件期间适用于域对象的规则,即当预订酒店房间时,会将确认发送给客户。

第三层是 UI 层,为了简化编码,这应该只处理第 2 层中的内容,这就是建议不要在 UI 中使用数据表的来源。

当您的应用程序很大,或者您有多个开发人员正在处理它,或者您正在使用单元测试时,拆分应用程序的动机才真正开始有意义。如果您处于这种情况,那么我会尝试找到您团队中的一位友好成员来更好地解释这一点,但如果这只是您自己编写一个应用程序,那么我不会太担心,写很多关于代码,阅读大量书籍,这些东西会更有意义,我会推荐 Craig Laman 关于 UML 和模式的书。

希望这可以帮助

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

为什么在 UI 中使用 DataTable 是错误的? 的相关文章

  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • 这种尺寸对齐是如何工作的

    对于所提供的评论 我无法理解以下代码 这段代码的作用是什么 以及等效的代码是什么8 aligned segment size must be 4 aligned attr gt options ssize 3 Here ssize is o
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando

随机推荐

  • Maven 在测试阶段之前运行类:exec-maven-plugin exec:java 不执行类

    我正在 Jenkins 盒子上运行使用 Maven 构建的 jUnit4 测试 我的目标是在执行测试之前恢复测试数据库 看起来 exec maven plugin 是可行的方法 但我无法让它运行 有什么指点吗 尽管有很多示例 但 mojo
  • 在 goroutine 中使用 exec.CommandContext 时如何调用 cancel()

    我想按需取消正在运行的命令 为此 我正在尝试 exec CommandContext https golang org pkg os exec CommandContext 目前正在尝试这个 https play golang org p
  • 有没有办法在 Vitejs 中的 React 项目中使用 PostCSS 来混淆 TailwindCSS 类名?

    目前正在使用 ViteJs 构建 React 项目 该项目使用 TailwindCSS 和 PostCSS 我希望在生产版本中混淆顺风类名 喜欢object cover to a2 另外 我的目标不是缩小 我尝试寻找解决方案 但没有运气 这
  • 使用 MigrationHistory 检测实体框架模型对于数据库是否太旧

    我们从手动编码数据库迁移转向代码优先的实体框架迁移 在我们的旧设置中 我们能够检查数据库是否太新 这很重要 因为它可能不兼容 不幸的是 我找不到一个好的方法来检查当前数据库的最新程度或是否太旧 用例是客户的计算机上有我们软件的 2 个版本
  • 自动找出 f# 中的函数名称

    如果我有一个属于模块一部分的函数 并且我想要在函数内部有一个日志条目 我必须手动打印函数名称空间和名称 例如 namespace MyModuleNamespace module MyModule let AddTwoNums logger
  • 我应该授权哪个 URL 在防火墙后面使用 pip?

    我有一台服务器 我想在其上使用 Python 该服务器位于公司防火墙后面 我不想搞乱它 我唯一能做的就是为特定的 URL 域设置防火墙例外 我还想使用 pip 或 easy install 访问 PYPI 上的包 因此 您知道除了 pypi
  • DOS批处理脚本转换字符串2十六进制

    如何在 DOS 批处理脚本中将字符串转换为十六进制 例如 将 abcd 转换为 61626364 因为 a 是 0x61 我尝试从网络上寻找解决方案 一天 但找不到我的答案 echo off setlocal EnableDelayedEx
  • 准备继续查看控制器时发生致命错误

    我目前正在得到一个解包可选值时意外发现致命错误在 destViewController titleLabel text 测试 Segue 由于当它转向 Seconds ViewController 时出现错误 我该如何修复它 如何避免在 t
  • gson json解析器:没有键的值

    我想解析这样的 json 结构 response arr1 count arr2 count 如果 count 有键 count 例如 则一切正常 但钥匙是空白的 有什么方法可以映射此结构并仅手动检索此值 或者我需要自己在没有 gson 的
  • yii2 登录重定向后丢失用户身份

    我看过其他类似的问题 而这个问题 页面重定向后 Yii2 用户身份丢失 https stackoverflow com questions 27738175 yii2 user identity loss after page redire
  • 如何创建一个基于文本内容动态宽度的div框? [复制]

    这个问题在这里已经有答案了 我想创建一个简单的div根据所包含的内容缩小和扩展 https jsfiddle net qa5dr0x8 https jsfiddle net qa5dr0x8 div style border 1px sol
  • 如何在 Eclipse 中关闭制表符和换行符标记?

    我正在使用 Adob e 的 ColdFusion Builder 这是一个构建在 Aptana 之上的基于 Eclipse 的 IDE 突然间 我的 Eclipse 编辑器中显示了一种空白标记 我一定是不小心按下了组合键 这是一个屏幕转储
  • 枚举 Delphi 中已发布的属性和子属性

    如果之前问过这个问题 我们深表歉意 我对一些组件的定义如下 如果错误请指导我 因为我是初学者 我正在尝试的是枚举派生组件的所有已发布属性 特别是子属性 我能够枚举属性的名称 但是 是否可以枚举在程序执行期间可以访问其元素 如子属性 的已发布
  • 如何验证字符串是否是js中的有效日期[重复]

    这个问题在这里已经有答案了 我有用于获取不同值的字符串字段 收到的一些值是日期 现在我需要检查收到的值是否是日期 收到的日期可以再次采用不同的格式 I tried Date parse 如果格式为dd mm yyyy hh mm 但我收到了
  • Android Studio中Toolbar必须用AppBarLayout包裹吗?

    代码A来自项目建筑样本 https github com android architecture samples 工具栏被 AppBarLayout 包裹 我删除 AppBarLayout 并获得代码 B 代码 B 与代码 A 一样运行良
  • Flutter:一页上有两 (2) 个抽屉?

    我有一个顶部栏 左侧 设置 和右侧 配置文件 都有图标 我需要一个抽屉 根据单击的图标从左侧或右侧滑出 我的左侧 设置 工作正常 但我不明白如何在一页上有两个抽屉 我相信拥有两个抽屉比根据所选链接以编程方式编辑抽屉更有意义 但我以前也经常犯
  • GestureDetector.onTouchEvent(MotionEvent e) 在所有手势上调用 onLongPress

    我有一个自定义视图 我想在其上设置长按监听器 我正在使用以下代码来设置相同的内容 final GestureDetector gestureDetector new GestureDetector new GestureDetector S
  • Html.HiddenFor 在 ASP.NET 中错误地格式化 DateTime

    我正在用 C 编写 ASP NET MVC3 应用程序 并发现调用Html HiddenFor在我看来会呈现DateTime与我打电话时不同 且错误 Html DisplayFor 它从中获取值的模型确实有一个 DisplayFormat
  • Linq to SQL 的未来是什么

    我一直在网上搜索 Linq 教程 发现一些文章说 linq 可能会消失 你对此有什么看法 微软真的会废除linq吗 Linq to SQL 并没有像实体框架那样受到足够多的关注来发展其功能 MS 已决定追求丰富 发展 EF 对于 L2S 这
  • 为什么在 UI 中使用 DataTable 是错误的?

    我是初学者 我发现很难理解这里的一个概念 有人告诉我不应该在 UI 级别使用 DataTable 请帮助我理解这个概念 解决方案 MyApp Data MyApp Logic MyApp Web MyApp Web 引用 MyApp Log