DataTable Wrapper 或如何将 UI 与业务逻辑解耦

2023-12-03

我正在使用 Web 表单、C#、Asp.net。 众所周知,在这个模型中,UI和业务逻辑经常是混合在一起的,如何有效地将它们分开呢?

我想使用的例子是: 我有一个 GridView 和一个 DataTable(GridView 绑定到 DataTable 并且 DataTable 由存储过程提供)。

我希望 GridView(UI)和 DataTable(业务逻辑)能够解耦。

为 DataTable 编写包装器值得吗?是否有一些已经被证明和测试过的实用模式可供您推荐遵循?

如果有经验的人可以提供一些线索,那就太棒了。 最后,我想说 ASP MVC 目前不是一个选择,所以不推荐它。

我的数据库访问层返回一个数据表。 请注意,我必须使用此数据库层,因为这是公司政策。


我最近经历了这个,同时将很多相同的事情与我们的 UI 层解耦。

你可以看到我的进步here and here.

在我看来,ADataTable does not代表业务逻辑。具体来说,它是直接从数据库中提取的数据。业务逻辑将数据转变为真正有用的业务对象。

那么,第一步是将 DataTable 与 Business 对象解耦。

您可以通过创建对象来做到这一点List<object>组成数据表和数据表集合,然后您可以创建一个显示这些对象的 ListView。我在上面发布的链接中介绍了后面的步骤。前面的步骤很简单,如下所示:

  1. 创建一个代表您的对象的类。
  2. 迭代您的 DataTable(或 DataSet,或者您检索数据的方式)并将这些字段推入该对象(或该对象)的属性中List<T>);
  3. 将该列表返回到 Gridview 或 ListView 进行显示。

这样,您的 ListView 或 Gridview 就不会与您检索数据的方法紧密耦合。如果您稍后决定从 JSON 查询或 XML 文件获取数据,会发生什么情况?然后你必须将其构建到那里。

第 1 步 - 从数据库获取数据

从数据库获取数据的方法有多种,我无法在这里一一介绍所有方法。我假设您已经知道如何从数据库中检索数据,如果您不知道,那么有相当多的链接跟随。让我们假设您已经连接到数据库,并且正在使用SQLDataReader检索数据。我们会在那里接载。

类图

Foo
----
id
Name
Description

这是方法:

 private void FillDefault(SqlDataReader reader, Foos foo)
        {
            try
            {
                foo.id = Convert.ToInt32(reader[Foo.Properties.ID]);
                foo.Name = reader[Foo.Properties.NAME].ToString();
                    
                
             if (!string.IsNullOrEmpty(
                reader[Foo.Properties.DESCRIPTION].ToString()))
                 foo.Description = 
                 reader[Foo.Properties.DESCRIPTION].ToString();
             else foo.Description = string.Empty;
            }
            catch (Exception ex)
            {
               throw new Exception(
               string.Format("Invalid Query. 
               Column '{0}' does not exist in SqlDataReader.", 
               ex.Message));
            }
        }

一旦发生这种情况,您可以通过在while目标循环SQLDataReader.Read()功能。

一旦你这样做了,让我们假装你的Foo返回的是一个List。如果您这样做,并按照我上面给出的第一个链接进行操作,您可以替换Dictionary<TKey, TValue> with List<T>并获得相同的结果(有微小的差异)。这Properties类只包含数据库中的列名,因此您可以在一个地方更改它们(如果您想知道的话)。

数据表 - 根据评论更新

您始终可以插入中间对象。在本例中,我将在 DataTable 和 UI 之间插入一个业务层,并且我已经在上面讨论了我要做什么。但 DataTable 不是业务对象;而是业务对象。它是数据库的可视化表示。您不能将其传输到 UI 层并将其称为解耦。他们说你必须使用 DataTable,他们是否说你have将该 DataTable 传输到 UI?我无法想象他们会这么做。如果你这样做,那么你将永远不会脱钩。您始终需要在 DataTable 和 UI 层之间有一个中间对象。

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

DataTable Wrapper 或如何将 UI 与业务逻辑解耦 的相关文章

  • 如何分配Profile值?

    我不知道我缺少什么 但我在 Web config 文件中添加了 Profile 属性 但无法访问 Profile Item在代码中或创建一个新的配置文件 我今天也遇到了同样的问题 学到了很多东西 Visual Studio 中有两种项目 网
  • 这段代码有什么问题。如果用户选择或不选择复选框,为什么它仍然显示 MsgBox? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 无论我是否选择复选框 它仍然会给出
  • 装配和产品版本不匹配

    我正在尝试在 asp net 网站中使用 Ajax 控件工具包 我从之前的一个示例项目中复制了 dll 它有以下详细信息 Assembly Version 3 5 40412 0 File Version 3 5 40412 2 Inter
  • ASP.net获取硬件信息

    如果我创建一个 ASP net 页面 我是否能够获取当前用户的 CPUID 和 BIOS 序列号 还是出于安全原因不允许这样做 我目前有一个获取这些值的 Visual Basic net 应用程序 我只是想知道是否可以在网页上执行相同的操作
  • Asp.net 开源项目作为 C# 的学习源 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 c 中的开源 asp net 最好是 net 2 0 项目 无论是某种商店 CMS 还是其他任何东西 都没有关系 重要的是项目
  • 在 ASP.NET 5 中创建基于每个请求控制器/操作的格式化程序

    我正在尝试在我的 ASP Rest API 中实现 HATEOAS 更改ReferenceResolverProvider 问题是 根据我使用的控制器 我想使用不同的ReferenceResolvers 因为我需要对每个控制器采取不同的行为
  • 将标签文本设置为 gridview 的总行数

    我使用 sql 数据库中的存储过程作为 aspx 页面上 SqlDataSourceControl 的数据源 然后 我使用 SqlDataSourceControl 作为页面上 gridview 的数据源 gridview 上的分页设置为
  • 无法在表适配器配置属性中找到对象“Web.config”的连接“MyConnName”

    I want to change the query in table adapter but it s not opening throwing an error Configure table Adapter Failed in pro
  • 是否有稳定的 ASP.NET 博客控件(设计用于集成到现有站点中)? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我看到了 dotnetblogengine net 并从论坛帖子中得到的印象是 将其集成到现有网站中并
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • .NET ServiceModel.Syndicate - 更改 RSS 源的编码

    我正在尝试解决我在以下位置生成的所有 RSS 源的错误http captainobvio us http captainobvio us在 Internet Explorer 版本 8 和 9 中产生以下错误 进给代码错误 从当前切换 编码
  • OpenXML - 保护所有工作表

    我只能保护一张工作表 但是当我尝试保护 Excel 文档中的所有工作表时 我在尝试附加 SheetProtection 时收到错误 如果我理解正确 我必须在 SheetData 之后附加 SheetProtection 这是我的代码 She
  • 回发 Asp.Net 上的动态用户控件

    我创建了一个项目 user control 它有一个文本框 按钮等 它将有意收集用户想要的项目总数 我在 page load 上动态创建了几个 user control 实例 如果您单击项目数量的添加按钮 它将添加到会话变量中 但是 当用户
  • 从异步方法同步调用 CPU 密集型方法的混乱

    我正在尝试 NET 4 5 的 async await 结构 我正在开发 RESTful Web API 解决方案 我试图弄清楚如何处理 CPU 绑定操作 1 从当前线程同步调用它 或 2 使用Task Run 让我们使用这个例子page
  • ASP.NET 网站上的 XSS 攻击 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我遇到了很大的麻烦 请帮忙 我的网站
  • Membership.ValidateUser() 的目的是什么

    我一直在学习有关MembershipProvider类 我认为Membership ValidateUser 方法应该用于登录用户 然而我刚刚了解到有一个FormsAuthentication Authenticate 目的是什么Valid
  • 保护 ASP.NET MVC 应用程序中的 ajax 调用的安全

    我有一个基于 ASP NET MVC 的应用程序 它允许根据用户进行不同级别的访问 当前的工作方式是 当用户访问页面时 会根据数据库进行检查以确定用户拥有的权限 然后根据用户拥有的访问级别选择视图 有些用户比其他用户看到更多数据并拥有更多可
  • 无法成功启动或连接到 MSBuild.exe 子进程。验证 MSBuild.exe

    我第一次遇到这种情况 运行构建并收到此错误 当我重建其他sln一切正常 错误 1 由于内部故障 构建意外停止 Microsoft Build Exceptions BuildAbortedException 构建已取消 无法成功启动或连接到
  • 使用 JavaScript 选择用户控件中的元素

    我有一个包含用户控件的 Web 表单 我希望能够使用 JavaScript 从表单页面访问用户控件中的 html 元素 我尝试了以下方法 document getElementById 但这返回了null 我用 firebug 环视了一下
  • asp.net cookie、身份验证和会话超时

    我有一个使用表单身份验证的 asp net 网站 我在会话中保留一些信息 例如用户名 用户 ID 电子邮件等 我通过在身份验证 cookie 上设置较长的到期日期来允许用户保持登录网站的状态 因此 当用户仍处于身份验证状态时 会话过期的情况

随机推荐

  • 从用户控件退出应用程序

    我的应用程序中有一个主窗口 MainWindow 在其 ContentControl 中托管一个 UserControl 我称之为 MainPage MainPage 承载另一个 UserControl 其中包含各种控件 KiviPage
  • 异步运行 mocha js(类似 AND)

    我可以在浏览器中异步加载 mocha 模块吗 我用柴肯定可以做到 有什么解决方法可以让 mocha 以类似 amd 的风格工作吗 require config baseUrl scripts paths mocha framework mo
  • 查找并打印 DIV 中的所有链接

    我试图找到 div 中的所有链接 然后打印这些链接 我正在使用 Simple HTML Dom 来解析 HTML 文件 这是我到目前为止所得到的 请阅读内联评论并让我知道哪里出错了 include simple html dom php h
  • 解析python中的嵌套括号,按级别抓取内容

    显然这个问题经常出现 读完后 思考了一会儿这个问题 我写了一个函数来返回任意数量的嵌套 中包含的内容 该函数可以轻松扩展到任何正则表达式对象 在此发布以供您的想法和考虑 任何重构建议将不胜感激 注意 我还是Python新手 不想弄清楚如何引
  • 检测到自引用循环 - 将数据从 WebApi 返回到浏览器

    我正在使用实体框架 并且在将父级和子级数据获取到浏览器时遇到问题 这是我的课程 public class Question public int QuestionId get set public string Title get set
  • 删除所有行并保留最新的 x left

    我有一张像这样的桌子 entryid roomid 1 1 2 55 3 1 4 12 5 1 6 44 7 1 8 3 9 1 现在我想删除 roomid 1 的所有条目并保留 剩余 roomid 1 中的最新 3 个 最好只用一个命令
  • 如何在通过括号表示法访问的元素上使用 jQuery 方法?

    jQuery 对象中的元素可以通过括号表示法访问 如下所示 div 0 但在这种情况下不能使用 jQuery 方法 还有其他方法可以访问某些元素或使用 jQuery 方法吗 如果您尝试获取集合中的第一个 jQuery 对象 请使用 jQue
  • 使用 pyfpdf 将 Base64 图像插入 pdf

    我在 python 中使用 pyfpdf 来生成 pdf 文件 我有一个 Base64 我想将其插入到 pdf 文件中 而不必将其另存为文件系统中的图像 但 pyfpdf 图像函数仅接受文件路径 fpdf image name x None
  • 选择组合的子集

    假设我有一个 20 X 5 矩阵 我想选择矩阵的子集并用它们进行一些计算 进一步假设每个子矩阵是 7 X 5 我当然可以这样做 ncomb lt combn 20 7 这给了我 7 个行索引的所有可能组合 我可以使用它们来获取子矩阵 但对于
  • 将 System.Web.UI.WebControls.Image 转换为 System.Drawing.Image?

    我似乎无法转换它 有什么帮助吗 它们是两个完全不同的对象 System Web UI WebControls Image是一个能够渲染 HTML 的控件 它将使浏览器下载并显示指定的图像 System Drawing Image是一个类 能
  • RODBC 和 Access - 加载数据

    我正在尝试将一些数据从 Access 数据库加载到 R 中 我能找到的所有说明都说使用 odbcConnectAccess file mdb 但我似乎无法加载此函数 是否已被替换或重命名 还有其他方法可以做到这一点吗 我已经用库 RODBC
  • 适用于 Android 和 GSON 的 ProGuard

    我正在为我的 Android 项目设置 ProGuard 我的项目也使用GSON 我研究了 ProGuard 配置与 GSON 和 Android 的兼容性 并发现了 google gson 提供的这个示例https code google
  • Python Seaborn 绘制空白直方图

    我正在尝试使用 python 中的seaborn 绘制直方图 但它给我的只是一个空白的数字 这里是describe 我的专栏 代码 plt subplots figsize 7 7 sns histplot data contratos x
  • 如何动态向react-bootstrap-table列添加href?

    我在react中使用react bootstrap table作为数据表 这里从后端获取c data作为JSON对象 如何动态地将ahref添加到react bootstrap table中的列 const data id 0 name J
  • 将列表传递给 subprocess.run

    我有一个脚本 其中包含一个列表 该列表只是我想传递给的一些参数subprocess run像这样 commands bash command 1 bash command 2 这是我的代码 commands bash command 1 b
  • Pandas read_csv 更改以 0 开头的列

    我有一个脚本 可以从 csv 文件中读取一些邮政编码 邮政编码的格式如下 zipcode 75180 90672 01037 20253 09117 31029 07745 90453 12105 18140 36108 10403 764
  • Bitbucket 管道:gcloud 崩溃 (UnicodeDecodeError)

    编辑 我想指出 如果我在计算机上使用云 sdk 手动部署 则不会发生此问题 仅限管道 再次编辑 我在 gcloud 应用程序部署中添加了 verbosity debug 这是生成的内容 Do you want to continue Y n
  • Jersey REST 服务上的用户身份验证

    我正在开发一个 REST 应用程序 它使用 Jersey 框架 我想知道如何控制用户身份验证 我查了很多地方 找到最接近的文章是这样的 http weblogs java net blog 2008 03 07 authentication
  • 当 RecyclerView 正在计算布局或尝试从 recyclerview 中删除项目时滚动时,无法调用此方法

    我正在尝试从 recyclerview 中删除我的项目 但我总是收到错误 java lang IllegalStateException 无法调用此方法 RecyclerView 正在计算布局或滚动 我正在使用notify datasetc
  • DataTable Wrapper 或如何将 UI 与业务逻辑解耦

    我正在使用 Web 表单 C Asp net 众所周知 在这个模型中 UI和业务逻辑经常是混合在一起的 如何有效地将它们分开呢 我想使用的例子是 我有一个 GridView 和一个 DataTable GridView 绑定到 DataTa