Re[13]: Singleton действительно антипаттерн в enterprize при
От: WolfHound  
Дата: 12.08.07 14:28
Оценка: +1
Здравствуйте, 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>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.