Ilya
а кто выбирает с контейнером?
это скрыто в контейнере
Ilya
тот кто регистрирует в контейнере
Roman
а кто это скрывает в контейнер?
Ilya
и ты в тестах можешь это замокать, если надо
Roman
ну вот тот же человек, который регистрирует в контейнере это, может композишн рут с таким же успехом написать ручками
Roman
и внезапно, внезапно, когда ты добавляешь новый параметр в чей-то конструктор, тебе компилятор сразу подсказывает, что тебе нужно вот тут и вот тут при вызове добавить недостающее
Roman
А DI контейнер молча прожует, пока прогу не прогонишь через определенный сценарий
Ilya
ну вот тот же человек, который регистрирует в контейнере это, может композишн рут с таким же успехом написать ручками
вот у меня есть интерфейс IMetricCollector и его реализация MetricCollector, как мне её использовать в своём классе class A { public void Do(){<Collect>} }
Roman
ну а как ты это используешь с DI? В конструктор пихаешь IMetricCollector mc так?
Roman
ну вот. А потом ты в композишн руте руками сначала создаешь инстанс метрик коллектора или его мока, а потом его передаешь в конструктор своего А
Roman
И если ты его 1 раз создаешь, а потом везде передаешь — вот тебе lifeStyle.Singleton
Roman
или PerWebRequest
Roman
Неужели выросло поколение разработчиков, которые без спринга прогу написать не могут?
Roman
даебтвоюмать ну
Ilya
или у меня есть program.cs
Roman
руками создаешь инстансы и все
Roman
и потом запускаешь тот код, который тебе нужен
Ilya
я хочу вызвать метод у A, какой од я должен написать?
Roman
как ты hello world пишешь? Что регистрируешь в контейнере?
Ilya
как ты hello world пишешь? Что регистрируешь в контейнере?
ты можешь мне просто напистаь 10 строк кода с инициализацией composition root и вызовом метода Do?
Ilya
а потом я напишу, как это делают обычно
Roman
я хочу вызвать метод у A, какой од я должен написать?
public void Main(){ var aCykaBliat = new A(new MetricCollector()); aCykaBliat.RandomShitGo(); }
Vasily
Вроде и не пятница
Roman
а потом я напишу, как это делают обычно
я знаю, как это делают обычно, и знаю, что вероятно портянка кода получается чуть меньше
Ilya
public void Main(){ var aCykaBliat = new A(new MetricCollector()); aCykaBliat.RandomShitGo(); }
отлично, теперь добавим класс B, который испольщзует A, что будет?
Vasily
А питерские интеллигенты уже готовы за раннего Гегеля друг друга на куски порвать
Ilya
тоже в конструктор зависимость
Ilya
я просто хочу понять. появится ли суррогатный тип CompositionRoot
Ilya
public void Main(){ var aCykaBliat = new A(new MetricCollector()); aCykaBliat.RandomShitGo(); }
var aCykaBliat = new B(new A(new MetricCollector())); aCykaBliat.RandomShitGo(); будет как то так?
Roman
Но ебтвою мать, если мы примитивный код инициализации объекта хотим заменить простыней регистраций, чтобы потом ебать себе мозги лайфтаймом, скоупом, багами в рантайме и все это с помощью нетривиального фреймворка с магией рефлексии, экспрешшнов и небось теперь сорсгенераторов — наъуй это надо а?
Roman
var aCykaBliat = new B(new A(new MetricCollector())); aCykaBliat.RandomShitGo(); будет как то так?
var metricCollector = new MetricCollector(); var ololo = new MockOlolo(); var a = new A(metricCollector, ololo); var b = new B(a); b.DoWork();
IdiocyAcceptance
Это глобальный спор DI vs не-DI?
Roman
да! Милости прошу к нашему шалашу
IdiocyAcceptance
Тогда я ворвусь сюда с блейзор-компонентами и спрошу как там без DI обойтись? :D
Ilya
это нигде не надо
тогда заинжекти мне коллекцию IMetricColletor, чтобы одну из её реализаций можно было написать отдельно
Roman
за блезор ничего не знаю
IdiocyAcceptance
Но думаю что ответ либо никак, либо наверное через такую боль, что ну нахер.
IdiocyAcceptance
Мне кажется что выбор фреймворка в общем и целом ставит все точки над DI/не DI, разве нет?
IdiocyAcceptance
Если фреймворк заточен под определённый стиль работы с зависимостями, то смысл плыть против течения?
Hog
I - заглавная. Точка над ней не нужна!
Roman
Но думаю что ответ либо никак, либо наверное через такую боль, что ну нахер.
хз про блезор. Мы в некоторых местах тоже вынуждены использовать DI, пушто там майкрософт любезно все прибил гвоздями к нему, сверху щедро полив эпоксидкой. Но тут проблема в МС и его инфре и сдк, а не в том, что DI концептуально какую-то важную проблему решает
Roman
например, в ажуре и кое-где в аспнете
IdiocyAcceptance
Т.е. у тебя AspNetCore - это DI 100% и ничего ты не сделаешь иначе (ну или через борьбу). Если у тебя какой-нибудь Giraffe, то вроде можно и обойтись (но я не пробовал)
Roman
тогда заинжекти мне коллекцию IMetricColletor, чтобы одну из её реализаций можно было написать отдельно
да я не понимаю, в чем тут проблема, если честно. class A { ctor (IMetricCollector){} } var mc = new MockMetrics(); var a = new A(mc);
Roman
ну дак инжекти, кто тебе не дает?
IdiocyAcceptance
Мне кажется вы рили спорите в режиме framework vs DI, то есть про разные вещи. И спор немного обречён на стагнацию)
Ilya
ну дак инжекти, кто тебе не дает?
как ты эту коллекцию определишь?
Vasily
Илья задает стандарты говнокода, смотрю
Ilya
у тебя в руте нету ссылки на все реализации
Roman
как ты эту коллекцию определишь?
вот как ты ее регистрируешь, так и определи, ну
IdiocyAcceptance
Так тут спор ради спора :)
Да, похоже что так.
Roman
у тебя в руте нету ссылки на все реализации
а куда они пропали? В моем руте все необходимые ссылки есть!
Hog
Два гриба - размножаются :)
Ilya
вот как ты ее регистрируешь, так и определи, ну
ну вот у меня есть например 2 стандартных мидлвари + 1 кастомная, место где они собирараются вместе - аспнет
Ilya
2 регает асп, одну я и всё работает
Ilya
а у тебя здесь надо написать new A(new[]{new M1(), new M2(), new M2())
Roman
как ты эту коллекцию определишь?
может, я не понимаю, о чем илья, но мой поинт, что DI не решает ни одной фундаментальной проблемы и нужен только чтоб вместо вызова конструкторов ручками писать Register<IMetricCollector>(new MetricCollector());, что получается немного короче, но менее надежно и гораздо сложнее
Roman
+ в этом случае, тебе надо обернуть в using a и b
ну и оберни на самом верхнем уровне, кто мешает?
Ilya
ну и оберни на самом верхнем уровне, кто мешает?
самый верхний уровень - недра библиотеки, которрая ничего не знгает о том, как её юзают
Roman
ну вот у меня есть например 2 стандартных мидлвари + 1 кастомная, место где они собирараются вместе - аспнет
в асп нет DI прибит гвоздями, да. Но это проблема реализации асп нета, а не фундаментальной необходимости DI
Roman
карочи
Roman
мне че-т надоело, я устал, я мухожук. Если Илья мою мысль не понял — бох ему судья
Roman
ну и Василий, конечно
Ilya
в асп нет DI прибит гвоздями, да. Но это проблема реализации асп нета, а не фундаментальной необходимости DI
хорошо, ты пишешь систему с возможность расширения, и у тебя нету в рантайме всей конфигурации, что тогда?
Ilya
собственно аналог configure services который можно вызывать много раз из многих мест
Tako
я думал хотя бы в вопросе использовать DI или нет сообщество консистентно
Ilya
но вообще я понял твой поинт
Ilya
но с моей точки зрения это выглядит: я не похож на всех, поэтому буду страдать