2

如果我的问题不清楚,请通过评论帮助我改进。

我是 Delphi 和 dbExpress 的新手,我刚刚熟悉 TSQLDataset、TDataSetProvider、TClientDataSet 和 TDataSource 类。

我正在从事的项目以一种让我感觉很奇怪的方式使用这些组件。有一个巨大的数据模块单元,其中包含大量前面描述的四重奏类。我猜有更好(和更模块化)的方法来做到这一点。DataSnap 仅用于将此数据模块放置在服务器应用程序中,以便客户端通过它访问数据。

所以,让我试着解释一下我的一些疑问:

  1. 每个类的作用是什么?我阅读了文档,但我无法对这个主题(特别是关于 TDataSetProvider)有实际的了解。
  2. 哪些类应该在数据模块中,哪些应该在我的表单中?
  3. 是否可以创建一个中间层来从我的数据库设置中抽象出我的业务模型(也许创建返回不可变数据集的函数?)?
  4. 如果是这样,使用 DataSnap 这样做是否明智?

如果我不够清楚,我很抱歉。提前致谢。

4

2 回答 2

5

成分

TDataSource 是数据感知控件与数据集(TDataSet 后代)之间的桥梁,它们将从中获取其值。

TClientDataSet 就是这样一个数据集。TClientDataSet 可以单独使用,例如访问包含在 xml 文件中的数据,但也可以连接到 TDataSetProvider。

TDataSetProvider 是内存中 TClientDataSet 和通过某种驱动程序从数据库获取数据的实际数据集之间的桥梁。在客户端服务器开发中,您通常会看到一个 TRemoteDataSetProvider(名称可能不同,我不经常使用这些组件),它弥合了客户端和服务器之间的差距。

TSQLDataSet 是从某个数据库获取数据的实际数据集。

在一个可执行文件中看到这个四重奏对我来说会很奇怪。我希望服务器端的 TSQLDataSet 连接到 TRemoteDataSetProvider 的对应部分。但是,我想使用嵌入式数据库它可能是一种支持公文包模型的方法,这就是 TClientDataSet 真正有用的地方(TClientDataset 非常强大,这只是它的优点之一。)


单数据模块

哎哟。单个巨大的数据模块是懒惰的编程或对如何使用数据模块的误解的结果。拥有一个“托管”数据库连接的单个数据模块是完全正常的,然后由更紧密关注应用程序各个方面的各种其他数据模块使用。


领域抽象

关于抽象您的业务模型,dbexpress 和 datasnap 真的不应该出现在您的业务模型中的任何位置。它们应该是您的数据层的一部分。

TDataSource、TClientDataSet 和自定义 TDataSetProvider 后代可用于利用 UI 中数据感知控件的强大功能,同时仍保持 UI 与业务模型分离。在这种情况下,自定义 TDataSetProvider 将成为客户端数据集与域层中的集合和实例之间的桥梁。

即便如此,我仍然希望看到一个单独的数据层,使用 TRemoteDataSetProviders 或直接 TDataSet 后代(如 TSQLDataSet)为域层提供其数据。

您提到的单个大数据模块可能是该数据层的一部分,客户端数据集为业务层提供其数据。正如您还提到 TDataSource 作为常见四重奏的一部分,该应用程序可能是以 RAD 数据感知方式开发的,其中 UI 控件基本上直接连接到数据库列/表。

如果您想将此应用程序转换为具有更分层的架构,请谨慎且缓慢地进行。首先了解当前的架构,并充分了解它,以了解这种转换将产生的影响。Serg 提供的链接肯定会对您有所帮助。Pawel Glowacki 撰写了大量有关 DataSnap 的文章。

于 2011-10-02T18:37:05.950 回答
2

您正在从事的项目是Delphi 多层数据库应用程序

你的问题对于 SO 来说太宽泛了,很难以目前的形式回答——你应该学会理解底层架构。

您可以从 Pawel Glowacki 的视频教程开始:

http://www.youtube.com/watch?v=B4uxLLIUddg

http://cc.embarcadero.com/item/28188

于 2011-10-02T18:17:17.043 回答