2

我有 3 个不同的 DataModule:ADOModule、SDACModule、AstaModule。所有都是相同的,除了它们使用的 DB 组件:ADO、SDAC、Asta。

所有这些 DataModule 都做同样的工作,但通过不同的组件。我的意思是 - 所有内部选择和执行都是相同的。

我搜索的是:一种将所有这些 DataModule 组合到一个 BaseDataModule 并强制 ADOModule、SDACModule 和 AstaModule 中的每一个从 BaseDataModule 继承的方法。

好吧,我发现继承方法和属性很容易,但我从来没有习惯从组件继承。有什么好的方法吗?项目目标:尽量减少编码和复制粘贴。

4

2 回答 2

1

请允许我建议一条不同的路径。我建议您编写所有基于TClientDataset任何其他特定数据集的 DataModules。添加所有需要的属性和方法,始终使用TClientDataset实例。

然后创建一个数据访问服务接口,比如说IDataProvider,提供选择数据和执行 SQL 语句的方法。select 方法将接收查询文本并返回一个OleVariant包含所有找到的记录(Data一个 internal 的属性TClientDataset)。This OleVariant,当分配给DataModule 上Data的实例的属性时,TClientDataset将填充它。

最后,将实现类写入IDataProvider. 这些类将取决于您需要支持的特定数据访问技术。

这种架构将使您的应用程序完全独立于数据访问方法。将来,如果您需要第四种方法来获取数据,您只需添加一个新的实现,IDataProvider其余的将继续工作。

如果您将这些实现类放在单独的包中,您将能够动态地设置您的应用程序以使用不同的数据访问方法,通过动态加载这些包,甚至无需重新编译您的应用程序。想想那是多么美好!

于 2014-04-04T11:17:57.560 回答
0

您有多种选择,但我将采取的方法如下:-

  1. 为您的数据库和查询组件创建一个抽象基类。您的基类应该定义您将需要的所有方法和属性。

  2. 为每个数据访问层创建具体的后代,这些后代有效地包装了底层数据访问层。

  3. 将当前数据模块代码移动到引用抽象组件类型而不是任何特定类型的访问层的非可视单元中。

  4. 您现在可以轻松地在访问层之间切换,甚至可以在未来添加新的访问层。

这是适配器(或包装器)模式的经典示例。

如果您不想重新发明轮子,您可能需要考虑查看诸如 tiOPF、InstantObjects 或 TMS Aurelius 之类的 OPF/ORM 解决方案,它们将为您提供相同的功能以及更多功能。

于 2014-04-03T13:24:25.393 回答