【问题标题】:Visual inheritance of DB components or New component?数据库组件或新组件的视觉继承?
【发布时间】:2014-05-15 07:29:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你不能用视觉继承来做到这一点。您需要在运行时构建所有数据库组件。无论如何,你应该这样做。
  • 可能存在作弊行为?我需要保存所有组件的方法,但只更改数据库组件。

标签: forms delphi oop inheritance visual-inheritance


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢,我在想TDataSet 基础,但它没有视觉外观。据我所知,TClientDataset 有一些错误和问题需要处理。也许有一个计划使用更久经考验的数据集,它可能是什么?因为这个想法对我来说比@Andy_D 的更清楚
【解决方案2】:

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

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

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

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

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

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

如果您不想重新发明轮子,您可能需要考虑使用 OPF/ORM 解决方案,例如 tiOPF、InstantObjects 或 TMS Aurelius,它们将为您提供相同的功能,而且还提供更多功能。

【讨论】:

  • 谢谢,这就是我想的方式,但想知道是否有更好更简单的解决方案。我真的不知道应该做些什么来用基类重新编码所有东西。谢谢。 tiOPF、InstantObjects 或 TMS Aurelius - 我现在还没有。
  • 在针对多个数据库平台时,这确实不难做到并带来红利。编写完基类后,您应该能够在下午编写一个新的访问层。 tiOPF 中的代码提供了一个很好的例子来说明如何做到这一点。它是开源的,因此您可以查看代码。 tiopf.sourceforge.net/Doc/Concepts/…
猜你喜欢
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 2017-03-12
  • 2019-07-02
相关资源
最近更新 更多