Re[16]: О пользе Dependency Injection
От: · Великобритания  
Дата: 16.01.21 00:36
Оценка:
Здравствуйте, 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 логику получения зависимости и всё, больше её нигде повторять не нужно.
Да, не нужно. Что ты имеешь в виду может повторяться и зачем?
avalon/2.0.6
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.