Строго говоря, внедрение зависимостей только противостоит НЕ внедрению зависимостей - и, следовательно, любой стратегии управления зависимостями, которая не является внедрением зависимостей.
[Нежелательная] связь, хотя и не совсем ортогональная, может либо возникнуть, либо быть смягчена в любом случае. Они оба связаны с DependencyClass
:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
связан с конкретным DependencyClass
в этом случае. Но они оба связаны с DependencyClass
. Настоящее зло, если оно есть, не обязательно связано, это то, что DependencyLookupConstructor
нужно изменить, если DependencyClass
внезапно понадобятся свои собственные зависимости 1 .
Однако этот конструктор / класс еще более слабо связан:
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
Если вы работаете в C #, вышеприведенное позволит вам ServiceLocator
возвращать что-либо при GetMyDoer()
вызове, если оно имеет do()
то, что DependencyLocatingConstructor
имеет do()
. Вы получаете преимущество проверки подписи во время компиляции, даже не будучи подключенным к полному интерфейсу 2 .
Итак, выбери свой яд.
Но в принципе, если есть конкретная «противоположность» внедрения зависимостей, это будет нечто другое в сфере «стратегий управления зависимостями». Среди прочего, если бы вы использовали в разговоре что-либо из перечисленного ниже, я бы узнал, что это НЕ внедрение зависимости:
- Шаблон сервисного локатора
- Зависимость локатор / местоположение
- Прямое построение объекта / зависимости
- Скрытая зависимость
- «Внедрение не зависимости»
1. Как ни странно, некоторые из проблем, которые DI решает на более высоких уровнях, являются своего рода результатом [чрезмерного] использования DI на более низких уровнях. Я имел удовольствие работать над кодовыми базами с ненужной сложностью повсюду в результате приспособления к горстке мест, где эта сложность действительно помогла ... По общему признанию, я предвзятый из-за плохой экспозиции.
2. Использование местоположения услуг позволяет также легко определить различные зависимости одного и того же типа, их функциональной роли из кода вызывающего , в то же время в значительной степени агностик о том , как строится зависимость. Предположим, вам нужно решить User
или IUser
для разных целей: например, Locator.GetAdministrator()
против Locator.GetAuthor()
- или как угодно. Мой код может запрашивать, что ему нужно функционально, даже не зная, какие интерфейсы он поддерживает.