Здравствуйте, adontz, Вы писали:
A>Callback'и на мой взгляд более приемлемое решение (особенно делегатами), но практическая реализация нередко затруднена. Кроме того этот самый указатель/делегат надо опять таки передать через все уровни и реальная разница в сложности реализации и поддержки между Dependency injection и Callback стирается.
Если использовать Dependency injection правильно, а не как ты то получается совсем другая картина:
void level3(ServiceProvider const* sp)
{
sp->get<ILogger>()->log("level 3!");
}
void level2(ServiceProvider const* sp)
{
level3(sp);
}
void level1(ServiceProvider const* sp)
{
level2(sp);
}
int main()
{
logger log;
log.initialize(bla-bla-bla);
ServiceProvider sp;
sp.add<ILogger>(&log);
level1(&sp);
}
А теперь добавим в лог вывод информации о втором уровне
void level3(ServiceProvider const* sp)
{
sp->get<ILogger>()->log("level 3!");
}
void level2(ServiceProvider const* baseSp, bla-bla-bla)
{
loggerWithSomeInfo log;
log.initialize(baseSp->get<ILogger>(), bla-bla-bla);
ServiceProvider sp(baseSp);
sp.add<ILogger>(&log);
level3(&sp);
}
void level1(ServiceProvider const* sp)
{
...
level2(sp, bla-bla-bla);
...
}
int main()
{
logger log;
log.initialize(bla-bla-bla);
ServiceProvider sp;
sp.add<ILogger>(&log);
level1(&sp);
}
Таким образом мы на каждом уровне можем: добавлять, удалять и заменять сервисы.
Жду решение на синглетоне...
Только учти что level1 навызывал level2 в куче потоков с разными bla-bla-bla...
... << RSDN@Home 1.2.0 alpha rev. 673>>