Dependency injection, singleton, metody statyczne - jak użyć?

0

Proszę o pomoc / wyjaśnienie w jaki sposób prawidłowo dzielić pewne dane ( np klasę DataBase ) dla całej aplikacji. Czytałem o wstrzykiwaniu zależności ( Dependency Injection ) i o wzorcu Singleton a teraz z czym mam problem...
Mamy klasę DataBase która ma być dostępna w kilku innych klasach w tym między innymi w klasie DataWorker w jaki sposób ja udostepniać?

// opcja 1 - dependency injection?

class DataBase
{
public:
    DataBase();

    void setValue( const std::string & key, const boost::any & value );
    const boost::any value( const std::string & key ) const;

private:
    std::map< std::string, boost::any > db;
};


class DataWorker
{
public:
    DataWorker( const DataBase & inDataBase ) : dataBase( inDataBase ) {}

    void process() { std::cout<< dataBase.value( "key" ); }

private:
    const DataBase & dataBase;

};

class Application
{
public:
    Application() : dataWorker( dataBase ) {}

private:
    DataBase dataBase;
    DataWorker dataWorker;

};

czy tak?

// opcja 2 z klasą z kilkoma metodami statycznymi


class DataBase
{
public:
    DataBase();

    static void setValue( const std::string & key, const boost::any & value );
    static const boost::any value( const std::string & key );

private:
    static std::map< std::string, boost::any > db;
};


//#include "database.h"
class DataWorker
{
public:
    DataWorker();

    void process() { std::cout<< DataBase::value( "key" ).toString().toStdString(); }

private:
    //----

};


class Application
{
public:
    Application();

private:
    DataBase dataBase;
    DataWorker dataWorker;

};

a może jest jeszcze inny sposób aby zrobić to co chcę?
Proszę o jakiekolwiek wskazówki, linki do stron, książek, wszystkiego co pomoże mi to zrozumieć. Dzięki ;)

0

Najlepiej użyć DI (Dependency Injection). Z tego co piszesz to DataBase jest adapterem, czyli implementuje jakiś abstrakcyjny interfejs do zarządzania "persistent" danymi. DataWorker to natomiast Repozytorium (taki pattern) który korzysta z interfejsu zaimplementowanego przez DataBase. Poczytaj o architekturze warstwowej i hexagonalnej. Generalnie obiekty bardziej abstrakcyjne (DataWorker) nie powinny mieć wiedzy o detalach (implementacji DataBase), a jedynie wiedzę o interfejsie którego używają, dlatego najlepiej podać go poprzez DI.

1 użytkowników online, w tym zalogowanych: 0, gości: 1