엄밀히 말하면, Dependency Injection 은 NOT Dependency Injection에 반대 하고 따라서 Dependency Injection 이 아닌 종속성 관리 전략 에만 반대 합니다.
[원치 않는] 커플 링은 정확히 직교적인 문제는 아니지만 어느 쪽이든 일어날 수 있거나 완화 될 수 있습니다. 이들은 모두 다음에 연결됩니다 DependencyClass
.
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
DependencyClass
이 경우 특정 에 연결됩니다 . 그러나 둘 다에 연결되어 DependencyClass
있습니다. 진정한 악은 여기에 존재하는 커플 링일 필요는 없습니다. 갑자기 자신의 의존성이 주입 된 1을 갑자기 필요로 DependencyLookupConstructor
한다면 변화 DependencyClass
해야합니다 .
그러나,이 생성자 / 클래스도되고 더 느슨하게 결합 :
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
당신은 C #으로 작업하는 경우, 위에서 당신을 허용합니다 ServiceLocator
반환 아무것도 할 때 GetMyDoer()
그것을 가지고만큼 수, 호출 do()
무엇 DependencyLocatingConstructor
그것이있다 do()
. 완전한 인터페이스에 연결하지 않고도 컴파일 타임 서명 유효성 검사의 이점을 얻을 수 있습니다 2 .
따라서 독을 선택하십시오.
그러나 기본적으로 Dependency Injection의 구체적인 "반대"가있는 경우 "종속성 관리 전략"영역에서 다른 것이 될 것입니다. 무엇보다도 대화에서 다음 중 하나를 사용한 경우 NOT Dependency Injection 으로 인식합니다 .
- 서비스 로케이터 패턴
- 종속성 로케이터 / 위치
- 직접 객체 / 의존성 구축
- 숨겨진 의존성
- "의존성 주입이 아님"
아이러니하게도, DI가 높은 수준에서 해결하는 몇 가지 문제는 낮은 수준에서 DI를 과도하게 사용한 결과입니다. 나는 불필요한 복잡성과 코드베이스 작업의 즐거움 했어 모든 이상 과 같은 복잡성이 실제로 도움이 장소의 소수 수용의 결과를 ... 나는 틀림없이 나쁜 노출에 의해 바이어스하고있다.
2. 서비스 위치를 사용 하면 호출 코드 의 기능적 역할에 의해 동일한 유형의 서로 다른 종속성을 쉽게 지정할 수 있으며, 종속성의 빌드 방법에 대해서는 여전히 거의 무관합니다. 예를 들어 대 또는 다른 목적으로 해결 User
하거나 IUser
다른 목적으로 사용해야한다고 가정합니다 . 내 코드는 지원하는 인터페이스를 몰라도 기능적으로 필요한 것을 요청할 수 있습니다 .Locator.GetAdministrator()
Locator.GetAuthor()