में पर्सिस्टेंस क्लासेस मैं नेट से क्यूटी तक एक मध्यम आकार के सीआरयूडी अनुप्रयोग को पोर्ट कर रहा हूं और मैं दृढ़ता वर्ग बनाने के लिए एक पैटर्न की तलाश में हूं। नेट में मैं आमतौर पर बुनियादी तरीके (डालने, अद्यतन,, हटाने का चयन करें) उदाहरण के लिए के साथ सार हठ श्रेणी का निर्माण:क्यूटी
public class DAOBase<T>
{
public T GetByPrimaryKey(object primaryKey) {...}
public void DeleteByPrimaryKey(object primaryKey) {...}
public List<T> GetByField(string fieldName, object value) {...}
public void Insert(T dto) {...}
public void Update(T dto) {...}
}
फिर, मैं इसे विशिष्ट टेबल/DTOs के लिए subclassed और डीबी तालिका लेआउट के लिए विशेषताएं कहा:
[DBTable("note", "note_id", NpgsqlTypes.NpgsqlDbType.Integer)]
[DbField("note_id", NpgsqlTypes.NpgsqlDbType.Integer, "NoteId")]
[DbField("client_id", NpgsqlTypes.NpgsqlDbType.Integer, "ClientId")]
[DbField("title", NpgsqlTypes.NpgsqlDbType.Text, "Title", "")]
[DbField("body", NpgsqlTypes.NpgsqlDbType.Text, "Body", "")]
[DbField("date_added", NpgsqlTypes.NpgsqlDbType.Date, "DateAdded")]
class NoteDAO : DAOBase<NoteDTO>
{
}
धन्यवाद। नेट प्रतिबिंब प्रणाली मैं भारी कोड पुन: उपयोग और नए ओआरएम के आसान निर्माण को प्राप्त करने में सक्षम था।
क्यूटी में इस तरह की चीजें करने का सबसे आसान तरीका QtSQL मॉड्यूल से मॉडल कक्षाओं का उपयोग करना प्रतीत होता है। दुर्भाग्यवश, मेरे मामले में वे बहुत ही इंटरफेस प्रदान करते हैं। मुझे कम से कम लेन-देन समर्थन और व्यक्तिगत प्रतिबद्धताओं पर नियंत्रण की आवश्यकता है जो QSqlTableModel प्रदान नहीं करता है।
क्या आप मुझे क्यूटी का उपयोग करके इस समस्या को हल करने के बारे में कुछ संकेत दे सकते हैं या मुझे कुछ संदर्भ सामग्री पर इंगित कर सकते हैं?
अद्यतन:
हेराल्ड के सुराग पर मैं एक समाधान है कि काफी ऊपर नेट वर्गों के समान है क्रियान्वित किया है के आधार पर। अब मेरे पास दो वर्ग हैं।
UniversalDAO कि QObject और QObject DTOs का उपयोग कर metatype प्रणाली के साथ सौदों विरासत:
class UniversalDAO : public QObject
{
Q_OBJECT
public:
UniversalDAO(QSqlDatabase dataBase, QObject *parent = 0);
virtual ~UniversalDAO();
void insert(const QObject &dto);
void update(const QObject &dto);
void remove(const QObject &dto);
void getByPrimaryKey(QObject &dto, const QVariant &key);
};
और एक सामान्य SpecializedDAO कि उचित प्रकार के UniversalDAOसे प्राप्त डेटा डाले:
template<class DTO>
class SpecializedDAO
{
public:
SpecializedDAO(UniversalDAO *universalDao)
virtual ~SpecializedDAO() {}
DTO defaultDto() const { return DTO; }
void insert(DTO dto) { dao->insert(dto); }
void update(DTO dto) { dao->update(dto); }
void remove(DTO dto) { dao->remove(dto); }
DTO getByPrimaryKey(const QVariant &key);
};
ऊपर का उपयोग करना, मैं निम्नलिखित के रूप में ठोस डीएओ वर्ग की घोषणा: मैं
class ClientDAO : public QObject, public SpecializedDAO<ClientDTO>
{
Q_OBJECT
public:
ClientDAO(UniversalDAO *dao, QObject *parent = 0) :
QObject(parent), SpecializedDAO<ClientDTO>(dao)
{}
};
से भीतर ClientDAOUniversalDAO के लिए कुछ डेटाबेस जानकारी सेट करना होगा।
QMap<QString, QString> fieldMapper;
fieldMapper["client_id"] = "clientId";
fieldMapper["name"] = "firstName";
/* ...all column <-> field pairs in here... */
dao->setFieldMapper(fieldMapper);
dao->setTable("client");
dao->setPrimaryKey("client_id");
मैं निर्माता में ऐसा है, तो यह किसी शीर्ष लेख के माध्यम से ब्राउज़िंग के लिए एक पहली नजर में नहीं दिखाई देता है: यह जहाँ मेरे कार्यान्वयन बदसूरत हो जाता है क्योंकि मैं इसे इस तरह करते हैं। .Net संस्करण में स्पॉट और समझना आसान था।
क्या आपके पास कुछ विचार हैं कि मैं इसे बेहतर कैसे बना सकता हूं?
शुरुआती बिंदु के रूप में अपनी युक्तियों और लिंक का उपयोग करके, मैंने समाधान के कार्यान्वयन को पोस्ट किया है। कृपया मुझे बताएं कि आप इसके बारे में क्या सोचते हैं। – zarzych