В последнее время большое внимание уделяется DI каркасам , даже при том, что паттерн DI забывается. Принципы Д.И. как обобщены Дж. Б. Рейнсбергер :
Это просто: сделать зависимости явными, требуя от соавторов
параметры в конструкторе. Повторите, пока вы не подтолкнули все решения
о том, какие объекты создавать в точке входа. Конечно, это только
относится к услугам (в смысле DDD). Готово.
Как вы заметили, нет большой разницы между настройкой зависимостей вручную и использованием фреймворка. С внедрением конструктора, как показано ниже, ваш пример кода будет иметь еще меньше шаблонов, и компилятор заставит вас предоставить все необходимые зависимости (и ваша IDE, вероятно, напечатает их для вас).
SawMill sawMill = new SawMill(new HandSaw());
sawMill.run();
Структура DI может уменьшить шаблон создания фабрик и связывания объектов вместе, но в то же самое время это может также затруднить обнаружение того, откуда происходит каждая зависимость - конфигурация структуры DI - это еще один уровень для изучения абстракции, и ваша среда IDE не сможет сказать вам, откуда вызывается конкретный конструктор.
Косвенным недостатком платформ DI является то, что они могут сделать подключение зависимостей слишком простым . Когда вы больше не можете чувствовать боль от множества зависимостей, вы можете просто продолжать добавлять больше зависимостей вместо того, чтобы переосмыслить дизайн приложения, чтобы уменьшить связь между классами. Соединение зависимостей вручную - особенно в тестовом коде - позволяет легче заметить, когда у вас слишком много зависимостей, так как настройка теста становится длиннее и становится сложнее писать модульные тесты.
Некоторые преимущества DI-фреймворков заключаются в их поддержке расширенных функций, таких как AOP (например, Spring @Transactional), области видимости (хотя много раз области видимости с простым кодом будет достаточно) и возможности подключения (если действительно необходим плагин фреймворка).
Недавно я провел эксперимент с ручным DI и DI на основе фреймворка. Прогресс и результаты показаны в виде скринкастов в Let's Code Dimdwarf эпизодах с 42 по 47 . В рассматриваемом проекте использовалась система плагинов Guice для создания актеров , которую я затем переписал с использованием ручного DI без Guice. В результате была реализована гораздо более простая и понятная реализация, и лишь немного больше шаблонов.
Сводка: Сначала попробуйте использовать только ручной DI (предпочтительно инжектор конструктора). Если их становится много, попробуйте переосмыслить дизайн, чтобы уменьшить зависимости. Используйте DI-фреймворк, если некоторые его функции обеспечивают вам ценность.