如何使用dbExpress和Delphi(也许是DataSnap)来抽象我的业务模型?

时间:2011-10-02 17:09:18

标签: database delphi dbexpress datasnap

如果我的问题不明确,请帮我改进评论。

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

我正在研究的项目以一种让我感到陌生的方式使用这些组件。有一个巨大的数据模块单元,包含许多前面描述的四重类。我猜测有更好的(更模块化的)方法。 DataSnap仅用于将此数据模块放在服务器应用程序中,因此客户端通过它访问数据。

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

  1. 这些课程的每一个角色是什么?我阅读了文档,但是我无法对这个主题有所了解(特别是关于TDataSetProvider)。
  2. 哪些类应该在数据模块中,哪些应该在我的表单中?
  3. 是否可以创建一个中间层来从我的数据库设置中抽象出我的业务模型(可能创建返回不可变数据集的函数?)?
  4. 如果是这样,使用DataSnap是否明智?
  5. 如果我不够清楚,我很抱歉。提前谢谢。

2 个答案:

答案 0 :(得分:5)

<强>零件

TDataSource是数据感知控件和数据集(TDataSet后代)之间的桥梁,用于获取它们的值。

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

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

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

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


单数据模块

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


域名抽象

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

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

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

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

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

答案 1 :(得分:2)

您正在处理的项目是 Delphi Multitier数据库应用程序

你的问题对于SO来说过于宽泛,而且目前的形式几乎无法回答 - 你应该学会理解基础架构。

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

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

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