4

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

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

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

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

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

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

4

3 回答 3

2

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

你可以在这里这里看到我的进步。

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

那么,第一步是将 DataTable 与 Business 对象分离。

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

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

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

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

有多种方法可以从数据库中获取数据,我无法在此处查看所有方法。我假设您已经知道如何从数据库中检索数据,如果您不知道,则有很多链接可供参考。假设您已连接到数据库,并正在使用 anSQLDataReader来检索数据。我们会在那里接。

类图

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只包含数据库中的列名,因此您可以在一个地方更改它们(以防万一)。

DataTable - 根据评论更新

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

于 2009-03-26T18:25:01.583 回答
0

我首先将数据表解耦到垃圾桶中。构建一个领域层,然后是某种类型的处理数据库的数据访问层(推荐使用 ORM)。

然后构建一个向 UI 提供数据的服务层。所有业务逻辑都应该在服务或实体本身内。

于 2009-03-26T18:26:13.077 回答
0

考虑实现 MVP(模型视图展示器)模式。它通过演示者界面为您提供了商业逻辑的分离,这也允许更好的单元测试能力。然后,您的 aspx 页面代码隐藏只是事件的连接器和属性的 getter/setter。您可以在 MS 模式和实践企业应用程序块(CAB - 复合应用程序块 - 如果我没记错的话)中找到它。
您可以在此处阅读有关它的更多信息:http: //msdn.microsoft.com/en-us/magazine/cc188690.aspx
但从 DataTable/DataSets 到对象 (POCO) 也是首选。

于 2009-03-26T18:26:45.573 回答