Примеры, обычно относящиеся к этому стилю внедрения, часто бывают чрезвычайно упрощенными: «в конструкторе по умолчанию для класса B
вызовите перегруженный конструктор с new A()
и будьте в пути!»
Реальность такова, что зависимости часто чрезвычайно сложны для построения. Например, что если B
нужна не классовая зависимость, такая как соединение с базой данных или настройка приложения? Затем вы связываете класс B
с пространством имен System.Configuration
, увеличивая его сложность и сцепление, одновременно снижая его когерентность, и все это для кодирования деталей, которые можно просто экстернализовать, опуская конструктор по умолчанию.
Этот стиль инъекций сообщает читателю, что вы узнали о преимуществах развязанного дизайна, но не желаете его использовать. Все мы знаем, что когда кто-то увидит этот сочный, простой конструктор по умолчанию с низким коэффициентом трения, он будет называть его независимо от того, насколько жестким он делает свою программу с этого момента. Они не могут понять структуру своей программы, не читая исходный код этого конструктора по умолчанию, что невозможно, когда вы просто распространяете сборки. Вы можете задокументировать соглашения имени строки подключения и ключа настроек приложения, но в этот момент код не становится самостоятельным, и вы возлагаете ответственность за разработчика на поиск правильного заклинания.
Оптимизация кода, чтобы те, кто его пишут, могли обойтись без понимания того, что они говорят, - это песня сирены, антишаблон, который в конечном итоге приводит к тому, что на раскрытие магии тратится больше времени, чем на первоначальные усилия. Либо отделить, либо нет; удерживание ноги в каждом узоре уменьшает фокусировку обоих.