TDataSource最初是出于什么原因而创建的?

13

为什么创建TDataSource作为数据绑定组件和实际基础TDataSets之间的中介,而不是让组件直接连接到TDataSets本身?

这可能看起来像是一个愚蠢的问题,但我正在开发一套广泛的“数据查看器”组件,这些组件链接到一个共同的“数据连接器”组件等等;在设计这一系列组件时,我发现自己参考经典的Delphi“TDataSet -> TDataSource -> 数据绑定组件”设置的结构。然而,在我的组件集中,我一直想将“TDataSource”和“TDataSet”的功能合并为单个类。这让我想知道最初分离它们背后的原因。

5个回答

13

这一切都与解耦间接性有关。

TDataSource有两种类型:

  • 解耦主从关系(TDataSource与被绑定的TDataSets在同一个模块中;详细的TDataSet通过将其MasterSource属性指向指向主TDataSet的TDataSource来引用主TDataSet)
  • 将UI与业务层解耦(TDataSets在DataModule中;TDataSource在包含UI控件的表单/框架上,UI控件引用其DataSource属性)。

由于许多组件可以指向相同的DataSource,因此您可以通过翻转一个TDataSource.DataSet属性快速切换它们使用的基础TDataSet。


11

我认为数据感知控件可以附加到不同的数据集上,只需更改与其关联的数据源指向的数据集,而无需更改每个控件的数据集。

因此,您可以通过更改单个数据源而不是大量的TDBEdit、TDBGrid等来更改使用的数据库。


1
在早期版本中,几乎不可能将组件附加到不同的数据库上。您需要为要使用的不同数据库拥有每个组件的版本,这意味着新数据库很难进入。通过将链接与源分离,您可以轻松切换。数据库也可以是仅运行时编程源。 - mj2008

6
  • TDataSet是用于访问数据库的。
  • TDataSource是用于用户界面的:禁用/启用、同步、数据流等。

如果您将这两个组件结合起来,您的数据库组件将依赖于您使用的特定用户界面基础架构。这种依赖关系在您自己的程序中可能没问题,但在分发给许多开发人员的API中不可行。


3
你可以将其看作某种模型-视图-控制器模式。数据位于 DataSet 中(即模型),它不知道谁在使用它们以及用途。
DB 意识组件为用户提供了不同的接口(即视图),以便与这些数据进行交互,而无需知道谁持有它们。
DataSource 是中间人(即控制器),提供链接并将任何数据更改或命令分派给模型或视图。
这允许轻松地绑定到不同的数据集,而无需触及视图,或者在不影响数据集的情况下更改或添加新视图。

2

我不确定开发团队是否考虑过这个,但它可能有助于更改数据集。假设您有一堆数据感知控件,它们都绑定到一个数据集,然后您想切换到另一个数据集。如果它们都通过中介绑定,那么您只需要更改数据源的.Dataset属性,而不是迭代所有控件并更改其属性。

(尽管根据设置方式,您可能仍然需要更改大量字段名称,因此这可能不是最佳示例。)


虽然这个问题很久以前就被提出来了,而且也有了很长时间的回答,但对我来说,这似乎是最有说服力的答案,但并不完全如此。你的逻辑无可挑剔,但情况有点奇怪。为什么一个表单需要切换数据集呢?特别是如果两个数据集有不同的字段,正如你所引用的那样。许多报告工具直接连接到数据集,而不是数据源。我猜这是因为在创建报告时数据没有发生变化。 - alvaroc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接