【发布时间】:2016-03-16 19:34:47
【问题描述】:
我想在“网格”控件中显示业务层对象列表。我还想在对话框中编辑任何给定的对象。
对象保存在关系数据库中,该数据库还执行引用和多用户完整性。尽管业务对象与数据库表非常相似,但我想在一定程度上使用某种“数据映射器”将它们解耦。
我的对象派生自 myDataObject 基类。基类有一个静态成员如下:
// Initialise a static list of member names for this class. Used when the object is displayed in a grid.
const std::vector<myDataObjectDescriptor> myDataObject::m_Descriptors
{
{ myDO_INT_FIELD, "UID", "m_UID", 40, false, false },
{ myDO_STRING_FIELD, "TITLE", "m_Title", 200, true, false },
{ myDO_STRING_FIELD, "DESCRIPTION", "m_Description", 400, true, false }
};
此描述符列表允许网格控件直接呈现具有正确列标题和宽度的对象列表。我可以使用 lambda 扩展基类描述符:
// Static initialisation of descriptor list using a lamda.
const std::vector<myDataObjectDescriptor> myDerivedDataObject::m_Descriptors = []
{
std::vector<myDataObjectDescriptor> v = myDataObject::m_Descriptors;
v.push_back ({myDO_STRING_FIELD, "BACKGROUND", "m_Background", 120, false, false});
v.push_back ({myDO_STRING_FIELD, "FONT", "m_Font", 120, false, false});
return v;
} ();
到目前为止一切顺利。现在,我想从数据库查询中创建一个对象列表,该列表可以是std::vector<some class derived from myDataObject>。我的数据库层返回一个结果集,允许一次检索一个行。
如何编写一个数据映射器,它接受对对象列表 (std:vector<some class derived from myDataObject>&) 的引用和对结果集的引用并填充列表?
附加信息:
目前我有 2 个方法在从 myDataObject 派生的每个类中被覆盖:
- FromData (myResultSet& resultset):从结果集中的当前行填充“this”对象。
- SetByName(字符串名称,变量值):根据其字符串化名称设置属性。 FromData 使用它来根据结果集中的字段名称设置属性。
对此我有很多不喜欢的地方,但主要是:
- myDataObject 不应该对数据库层有任何了解(也 紧密耦合)。
-
SetByName 是一系列 if 语句,如果 'name' 参数匹配,则设置属性,即
if (name == "m_Title") m_Title = value;
编辑重新。 rumburak 的评论:一旦我解决了阅读问题,我计划以某种方式对持久化数据进行相反的处理。
【问题讨论】:
标签: c++ c++11 datamapper