c++ - 支持多种持久化策略的类库

标签 c++ design-patterns persistence

我正在开发一个包含域模型类的 C++ 类库,我想添加对从各种持久性机制(即数据库和文件)实例化这些类的支持。应该为类库的用户提供一个接口(interface)(?),根据该接口(interface)编写一个可以将数据从持久性机制传输到持久性机制的类。

我知道数据访问对象模式似乎适用于 Java,但我不太确定如何将其应用到 C++。还有其他解决方案吗?

最佳答案

C++ 支持多重继承,因此您可以拥有通用的持久性 API 并继承持久性机制。这仍然需要使用内省(introspection)来获取类元数据,但是任何持久层仍然会遇到这个问题。

或者,您可以执行类似的操作,但使用元数据来驱动代码生成器,该生成器填充持久层的“Getters”和“Setters”。

任何持久层通常都会使用一种或另一种方法,因此您的问题是将加载机制挂接到持久层中。我认为这使得您的问题与单个持久层没有什么不同,而是从另一个方向解决它。您不是在持久性框架上构建域类,而是提供一组带有持久性框架钩子(Hook)的域类,第三方可以将其数据访问机制插入其中。

我认为,一旦您提供对类元数据和回调的访问,持久性机制就相对简单。查看任何方便的 C++ O/R 映射框架的元数据组件并了解它们的工作原理。使用 API 将其封装在域类的基类之一中,并提供用于实例化或持久化的通用 getter/setter API。其余的取决于实现持久层的人。

编辑:我无法想到具有您所描述的可插入持久性机制类型的 C++ 库,但我在 Python 中做了一些可以添加此类功能的操作。尽管基本原理可能适用于 C++,但特定的实现使用了 Python 中的设施,没有直接的 C++ 等效项。

在Python中,您可以通过重写__getattr()____setattr()__来拦截对实例变量的访问。持久化机制实际上在幕后维护了自己的数据缓存。当功能混合到类中(通过多重继承完成)时,它会覆盖成员访问的默认系统行为,并检查正在查询的属性是否与其字典中的任何内容相匹配。发生这种情况时,调用将被重定向以获取或设置数据缓存中的项目。

缓存有自己的元数据。它了解其数据模型中实体之间的关系,并且知道要拦截哪些属性名称以访问数据。这种工作方式将其与数据库访问层分开,并且可以(至少在理论上)允许持久性机制与不同的驱动程序一起使用。没有任何内在原因导致您无法(例如)构建一个将其序列化为 XML 文件的驱动程序。

在 C++ 中进行类似的工作会有点麻烦,并且可能无法使对象缓存访问像在该系统中那样透明。您可能最好使用显式协议(protocol)来加载对象的状态并将其刷新到缓存中。此代码非常适合从缓存元数据生成,但这必须在编译时完成。您也许可以使用模板或覆盖 -> 运算符来执行某些操作,以使访问协议(protocol)更加透明,但这可能弊大于利。

关于c++ - 支持多种持久化策略的类库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/113818/

相关文章:

c++ - 如何将着色器中生成的 float 据(而非颜色)拉回到 CPU?

c++ - 如何将函数插入 C++ 中的数组?

C++ 可变参数模板方法特化

c++ - A 类的对象作为 B 类的成员。B 需要 A 的对象来初始化自身

spring - 没有命名 EntityManager 的持久性提供程序

haskell - 节省空间的嵌入式 Haskell 持久性解决方案

c++ - boost::make_shared 导致访问冲突

c# - 当表单的类变得太大时怎么办?

java - 处理以下场景的设计模式

python - python (cherrypy) Web 应用程序的持久性?