我最近经历了这个,同时将很多相同的事情与我们的 UI 层解耦。
你可以看到我的进步here and here.
在我看来,ADataTable
does not代表业务逻辑。具体来说,它是直接从数据库中提取的数据。业务逻辑将数据转变为真正有用的业务对象。
那么,第一步是将 DataTable 与 Business 对象解耦。
您可以通过创建对象来做到这一点List<object>
组成数据表和数据表集合,然后您可以创建一个显示这些对象的 ListView。我在上面发布的链接中介绍了后面的步骤。前面的步骤很简单,如下所示:
- 创建一个代表您的对象的类。
- 迭代您的 DataTable(或 DataSet,或者您检索数据的方式)并将这些字段推入该对象(或该对象)的属性中
List<T>
);
- 将该列表返回到 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 层之间有一个中间对象。