asp.net - DataTable Wrapper 或如何将 UI 与业务逻辑分离

标签 asp.net gridview webforms datatable decoupling

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

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

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

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

如果有经验的人能解释一下,那就太棒了。
而且,作为最后一点,我想说 ASP MVC 现在不是一个选项,所以不推荐它。

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

最佳答案

我最近经历了这个,同时从我们的 UI 层解耦了很多相同的东西。
你可以看到我的进度herehere .
在我看来,A DataTable 不是 代表业务逻辑。具体来说,它是直接从数据库中提取的数据。业务逻辑将这些数据转化为真正有用的业务对象。
然后,第一步是将 DataTable 与 Business 对象分离。
您可以通过创建对象和 List<object> 来做到这一点。组成数据表和数据表集合,然后您可以创建一个显示这些对象的 ListView。我在上面发布的链接中介绍了后面的步骤。前面的步骤如下所示:

  • 创建一个代表您的对象的类。
  • 遍历您的 DataTable(或 DataSet,或者您检索数据)并将这些字段插入该对象(或 List<T> )的属性中;
  • 将该列表返回到要显示的 Gridview 或 ListView。

  • 这样,您的 ListView 或 Gridview 将不会与您检索数据的方法紧密耦合。如果您决定稍后从 JSON 查询或 XML 文件中获取数据,会发生什么?然后你必须把它建在那里。
    第 1 步 - 从数据库中获取数据
    有多种方法可以从数据库中获取数据,我无法在此处查看所有方法。我假设您已经知道如何从数据库中检索数据,如果您不知道,有 quite a few links跟随。假设您已连接到数据库,并且正在使用 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返回的是一个列表。如果你这样做,并按照我上面给出的第一个链接,你可以替换 Dictionary<TKey, TValue>List<T>并达到相同的结果(差异很小)。 Properties class 只包含数据库中的列名,因此您可以在一个地方更改它们(以防您想知道)。
    DataTable - 根据评论更新
    您始终可以插入中间对象。在本例中,我将在 DataTable 和 UI 之间插入一个业务层,并且我已经在上面讨论了我要做什么。但是 DataTable 不是业务对象;它是数据库的可视化表示。您不能将其传输到 UI 层并将其称为解耦。他们说您必须使用 DataTable,他们是否说您必须将该 DataTable 传输到 UI?我无法想象他们会。如果你这样做了,那么你将永远不会解耦。在 DataTable 和 UI 层之间总是需要一个中间对象。

    关于asp.net - DataTable Wrapper 或如何将 UI 与业务逻辑分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/686960/

    相关文章:

    javascript - 如何使用 javascript 在用户控制页面中获取父页面名称

    asp.net - 敏感的 ASP.NET Session 数据是否需要加密?

    c# - 使用 C# 将文本文档分成多个部分

    java - CAB 上的 Android 持久 gridview 选择器

    c# - ASP.Net Listview 空 ItemTemplate 不显示

    javascript - 在下拉列表更改时调用 Javascript 函数

    c# - 将 Angular 与现有的 Asp.Net 网站一起使用

    c# - 在 Visual Studio 开发服务器上启用 Soap Web 服务的 CORS 设置

    android - 不同屏幕尺寸的样式可以不同吗?

    asp.net - 在 GridView 自动数据绑定(bind)中捕获错误