Здравствуйте, Somescout, Вы писали:
S> ·>Этот антипаттерн называется Service Locator... Противоположность DI.
S> Я написал ниже в каких случаях я его использую. От того что что-то называют "антипаттерном" оно не становится автоматически плохим.
И в этих случаях он таки не нужен, внезапно. Т.е. антипаттерн. Вот смотришь на такое
CallerObj(IServiceProvider serviceProvider) и пока не просмотришь весь код такого класса — никак не не поймёшь от чего собственно он зависит. Такой класс зависит от _всего_. Глобальные Переменные™, просто под другим соусом.
S> ·>Т.е. кода таки больше получилось.
S> Инициализация DI делается один раз. "Так что кода всё-таки меньше получилось" (и да, "аргумент секретарши" судя по всему идёт через года).
Composition Root тоже делается один раз.
S> S>> Понятно что этот способ (т.е. через ServiceProvider) используется исключительно в том случае, когда инициализация SomeObject дорогая и сам объект используется он не всегда (я использую его только в контроллере, когда лишь часть экшенов использует его),
S> ·>Вроде это банальный Lazy...
S> И?
И то, что достаточно иметь Lazy<SomeObject> из которого можно получить ровно то что надо, а не что угодно и хз что подразумевалось.
S> ·>А если не использовать фреймворк, то такого рода ошибки будут сразу в IDE подсвечиваться, как ошибки компиляции.
S> Только в том случае, если вы прямо или косвенно завязаны на конкретные классы. Что, внезапно, тоже "антипаттерн".
Ты так говоришь как будто
...Bind<IDbContext,DbContext>... не завязано на конкретные классы. Суть Composition Root это и есть связывание конкретных классов.
S> S>> И да, этот "весь код" явно ссылается на **реализации** используемых классов, затрудняя его переиспользование (за которое тут так ратуют),
S> ·>Такой код собирает конечное приложение, так называемый Composition Root. Если части приложения нужно переиспользовать, классы можно интегрировать в модуль с подходящими областями видимости и зависимостями, а не кидать всё в глобальный мусорный контейнер.
S> Когда я вижу как кто-то ударяется в демагогию, у меня возникает стойкое ощущение отсутсвия у него аргументов.
В чём демагогия? Контейнер это глобальная свалка всех объектов приложения, из которой беcконтрольно тянется всё отовсюду.
S> ·>Нет, тот же ConnectionString прокинется через ровно такой же DI.
S> Зачем? Вы просто зададите в DI логику получения зависимости и всё, больше её нигде повторять не нужно.
Да, не нужно. Что ты имеешь в виду может повторяться и зачем?