Я запускаю новое приложение, которое сможет одновременно подключаться ко многим базам данных разных провайдеров.
Придумав шаблон, чтобы легко использовать все соединения, я сделалэтот код (C ++):
class Bd
{
private:
TUniConnection* mpConnection;
public:
Bd::Bd()
{
mpConnection = new TUniConnection(NULL);
}
void Bd::setProvider(UnicodeString provider)
{
mpConnection->ProviderName = provider;
}
void Bd::connect()
{
mpConnection->Connect();
}
UnicodeString Bd::getProvider() const
{ return mpConnection->ProviderName; }
Bd::~Bd()
{ delete mpConnection; }
};
// In the right path to become a singleton-helper-utility-god-class
class App
{
public:
// Default bd. Just a shortcut.
Bd* bd;
App()
{ bd = getBd("BDMain"); }
~App()
{ delBd("BDMain"); }
Bd* getBd(UnicodeString key)
{
if(mpBdList[key] != NULL)
{
return mpBdList[key];
}
mpBdList[key] = new Bd;
return mpBdList[key];
}
void delBd(UnicodeString key)
{
delete mpBdList[key];
mpBdList[key] = NULL;
}
private:
std::map<UnicodeString, Bd *>mpBdList;
};
// Just an example of use.
int main()
{
// Consider this instance global/singleton/etc
App* app = new App;
app->bd->setProvider("Oracle");
app->connect();
// Outside the main, probably in some form (this method don't exist - yet)
app->bd->query("blah blah blah");
app->getBd("settings")->setProvider("SQLite");
app->getBd("settings")->connect();
app->getBd("settings")->query("blah blah blah");
}
Очевидно, что пока не работает, но вы, ребята, можете понять мою мысль.Теоретически выглядит идеально.Я могу легко получить доступ к основному соединению (app-> bd) и короткому коду.То же самое с другими соединениями.Даже идеально для меня, все говорят, что это анти-паттерн и все такое.
Как я могу достичь почти такого же результата, без этого «вспомогательного» класса, и все же иметь возможность поделиться своими подключениями / настройками для всех форми классы, не передавая ничего параметрам / конструкторам.
спасибо.