我正在开发一个包含域模型类的C++类库,我想增加对从各种持久性机制(即数据库和文件)实例化这些类的支持。应该为类库的用户提供一个接口(interface)(?),可根据该接口(interface)对一个类进行编程,该类可以将数据从持久性机制传输到持久性机制。
我知道似乎适用于Java的数据访问对象模式,但是我不确定如何将其应用于C++。还有其他解决方案吗?
最佳答案
C++支持多重继承,因此您可以拥有通用的持久性API并继承持久性机制。这仍然必须使用自省(introspection)来获取类元数据,但是任何持久层仍然会出现此问题。
或者,您可以执行类似的操作,但使用元数据来驱动代码生成器,以为持久层填充“Getters”和“Setters”。
任何持久层通常都会使用一种或另一种方法,因此您的问题是将加载机制挂接到持久层中。我认为这使您的问题与单个持久层几乎没有什么不同,但从另一个方向进行了解决。与其将域类构建到持久性框架上,不如提供一组具有持久性框架挂钩的域类,第三方可以将其数据访问机制插入到该类中。
我认为,一旦提供对类元数据和回调的访问,持久性机制就相对简单了。查看任何方便的C++ O / R映射框架的元数据组件,并了解它们如何工作。使用API将其封装在您的域类的基类之一中,并提供用于实例化或持久化的通用getter / setter API。其余的取决于实现持久层的人。
编辑:我无法想到您所描述的具有可插拔持久性机制类型的C++库,但是我在Python中做了一些可能添加了此类功能的工具。尽管基本原理可能适用于C++,但特定实现使用的Python工具没有直接的C++等效项。
在Python中,您可以通过覆盖__getattr()__
和__setattr()__
来拦截对实例变量的访问。持久性机制实际上在后台维护了自己的数据缓存。当将功能混合到类中(通过多重继承完成)时,它将覆盖成员访问的默认系统行为,并检查要查询的属性是否与其词典中的任何内容匹配。在发生这种情况的地方,调用将被重定向以获取或设置数据缓存中的项目。
缓存具有自己的元数据。它知道其数据模型中实体之间的关系,并且知道要拦截哪些属性名称才能访问数据。这种工作方式将其与数据库访问层分开,并且可能(至少在理论上)已允许将持久性机制与其他驱动程序一起使用。没有内在的理由,例如,您无法构建将其序列化为XML文件的驱动程序。
用C++进行类似的工作会有些麻烦,并且可能无法像在此系统中那样使对象缓存访问透明。最好使用显式协议(protocol)将对象的状态加载并刷新到缓存中,这是最好的。从缓存元数据生成代码很容易,但是必须在编译时完成。您可能可以使用模板或通过重写->
运算符来做一些事情,以使访问协议(protocol)更加透明,但这可能比其值(value)更大。