Я думаю, это отличное упражнение - начинать без DI-контейнера.Прежде чем сосредоточиться на использовании структуры DI, сфокусируйтесь на лучших шаблонах и практиках.В частности, спроектируйте все классы вокруг Dependency Injection и убедитесь, что ваш код соответствует принципам SOLID .И то, и другое звучит довольно легко, но это требует изменения мышления и большой практики, прежде чем вы поймете это правильно (но оно того стоит).
Когда вы сделаете это и сделаете это хорошо, вы быстрообратите внимание, что ваше приложение будет развиваться удивительным образом.Ваш код будет тестируемым и расширяемым способами, которые вы никогда раньше не представляли, без гниения кода с течением времени (однако, он сохраняет постоянный фокус, чтобы не допустить гниения кода).(что, опять же, требует большой практики), у вас все равно будет одна часть вашего приложения, которая, несмотря на все ваши усилия, будет становиться все сложнее и сложнее в обслуживании по мере роста приложения.Это часть приложения, где вы связываете все зависимости вместе: Composition Root .
И именно здесь входят DI-контейнеры. Они имеют причудливые имена и конкурируют друг с другом за функции, но их цель может быть сформулирована в одном предложении:
Цель контейнера DI состоит в том, чтобы поддерживать корень композиции в поддерживаемом состоянии.
Хотя вы можете написать свой собственныйПростой DI-контейнер для подключения ваших зависимостей, чтобы корень композиции не превратился в большой хрупкий, постоянно меняющийся шарик грязи, контейнер должен иметь, по крайней мере, одну важную особенность: автоматический инжектор конструктора (так называемое автоматическое подключение).При автоматическом подключении контейнер будет проверять аргументы конструктора того типа, который ему нужно создать, и вставлять в него зависимости, основанные на типах этих аргументов.Эта функция будет отличать кошмар обслуживания от здорового корня композиции.Хотя создание собственного контейнера, поддерживающего автоматическую разводку, не так сложно (с деревьями выражений это занимает около 20 строк кода), момент, когда вы начинаете нуждаться в автоматической разводке, - время начать использовать одну из существующих плат DI.
Итак, в заключение, если вы чувствуете, что это помогает вам в обучении, делая это вручную, делайте это, пока вы придерживаетесь SOLID, DI, DRY и TDD.Когда бремя изменения корня композиции для каждого изменения в приложении становится слишком большим (что будет быстрее, чем вы ожидаете), переключитесь на установленную среду.