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