1

我正在开发一个 C++ 域模型类库,它应该提供一些设施或框架(即接口类等),用于向二进制文件和 RDBMS 写入/读取类实例数据。这个库的基础是一个使用 RDBMS 的应用程序,并且有几个方法通过执行一系列数据库检索和更新调用来获取成员数据的集合来实例化一个类。序列化数据访问具有不同的数据组织方式,因此我希望域模型完全不知道主键/外键、ID 等。

为了解决这个问题,我考虑使用数据访问对象(DAO) 模式,并希望对 DAO 对象的“粒度”、生命周期和使用提供一些建议(在您的回复中,请注意我将使用 C++ ,而不是 Java,并且域类不能保存来自 RDBMS 或二进制文件存储的任何 ID/密钥信息):

  1. 域对象的每个 Foo 实例是否都有自己的 FooDAO 实例,或者 Foo 类的所有实例是否都有一个 FooDAO 实例?
  2. FooDAO 是为每个 Foo 实例创建一次,还是仅在需要访问数据时才创建 FooDAO 实例,然后立即销毁?
  3. DAO 上的J2EE页面除了 DAO 之外还引入了 DTO。为什么 DAO 不能传输数据?
  4. 对于具有其他域类 Bar 的实例的复杂域类 Foo,FooDAO 类似乎不可避免地使用 BarDAO 类来检索数据。这将导致域类结构和 DAO 类结构中的并行层次结构/依赖关系。如何最好地管理它?

谢谢你的帮助!

4

2 回答 2

1

我没有给你一个好的解决方案,但我可以告诉你我有什么,以及一些想法和经验。基于我之前看到的模型,我构建了一些非常相似的东西,作为 C++ 库。

一些想法,没有特别的顺序:

  • 为数据库中的每个实例拥有一个单独的 DAO 对象实例。如果你有一个共享实例,线程同步可能是个问题,你会被迫做很多副本。
  • 出于几个原因,我的库 DAO 类使用与 RDBMS 类型密切相关的类型。首先,该库支持在底层数据存储中自动创建和更新存储,因此类需要有足够的信息来创建表。其次,它使数据转换更加容易,并且可优化(例如,您可以使用本机接口直接进行 ODBC/OLEDB 数据复制)。缺点是你不能在 DAO 对象中拥有“好的”类类型(例如:比实际字符串缓冲区具有更多数据的字符串抽象)。
  • 当然,我是按需创建的,因为存储中的数据可能比实际放入内存中的数据要多得多。
  • 我尽量保持 DAO 类简单,访问器功能最少,并且“接近”底层数据结构。这意味着没有从其他 DAO 类继承,实例具有关键变量成员等。

在 DAO 类之上,我构建了更易于访问的类,这些类代表我的应用程序中的数据,并且可能会或可能不会将 1-1 映射到 DAO 类。这些允许具有任何类型的成员和结构,应该是应用程序使用的,并且具有将数据复制到/从作为它们基础的 DAO 类的方法。

希望有帮助。

于 2008-10-13T17:35:15.373 回答
0

我不知道最好的实现,但这是我所看到的:

  1. 为每个实例分开。
  2. 在需要它之前创建并在之后立即销毁。
  3. 不知道。
  4. 合并 DAO 实例之外的数据,从而避免耦合。

免责声明:这正是我所看到的。

于 2008-12-05T21:31:35.747 回答