成分
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 的文章。