我(我应该)可以将我的DBClientConnection用作全局变量吗?

时间:2013-04-19 19:30:18

标签: c++ qt mongodb

  • Windows 7 SP1
  • MSVS 2010年
  • MongoDB 2.2.0
  • Qt 4.8.4

编写单线程应用程序。我总是将DBClientConnection作为参考参数传递给任何需要访问MongoDB的函数。我可以使用全局变量,这样我就不必传递参数吗?

使用Qt的QKeyEvent时出现了这个问题。这是用这个原型实现的:

void keyPressEvent(QKeyEvent * key_event);

重新实现:

void QWidget::keyPressEvent ( QKeyEvent * event )

我想从哪个函数调用MongoDB函数,但是我无法访问keyPressEvent中的DBClientConnection。因此,我正在考虑将DBClientConnection设为全局。

1 个答案:

答案 0 :(得分:1)

推荐的解决方案是数据库对象的抽象。

Here is an explanation of the concept in C#

但是简单地说它只是在C ++中,目的是定义一个接口。这就是全部。 IDatabaseIRepository

它或多或少地具有您建议的全局值的作用,但您将其隐藏为FactoryDependencyInjection机制......或全局值,如{{1如果你真的想要。

但是具体的Singleton将实现连接的东西,并指向真正的mongoDb应该打扰这个指针。不是你的应用程序的其余部分。 最重要的是,如果它在您的QWidget :: keyPressEvent之类的GUI内部,您计划访问数据库

class MyMongoDatabase

在您的逻辑/商业代码中,您只能拥有:

class MyMongoDatabase : public IDatabase
{
    private:
        void connect();
        void disconnect();

    public:
        std::vector<Something> query_something(int param);
        void insert(AnOtherThing& thing);
        //.... other crud operations
};

IDatabase& database = getDatabase(); std::vector<Something> somethings = database.query_something(); 将公开查询,插入和其他CRUD操作的所有函数。背后的想法被称为松散耦合&#39;。

看看它是否值得编码。这取决于您在应用程序中执行此类操作的时间。一般来说,对于像数据库这样大的东西,这是一个非常好的主意。