내가 아는 유일한 합법적 의존성 주입 반 패턴은 DI 프레임 워크가 사용될 때 반 패턴 인 Service Locator 패턴입니다.
여기 또는 다른 곳에서 들었던 다른 소위 DI 안티 패턴은 일반적인 OO / 소프트웨어 디자인 안티 패턴의 약간 더 구체적인 사례입니다. 예를 들어 :
생성자 과다 주입은 단일 책임 원칙을 위반하는 것입니다 . 생성자 인수가 너무 많으면 종속성이 너무 많음을 나타냅니다. 너무 많은 종속성은 클래스가 너무 많은 것을 시도하고 있음을 나타냅니다. 일반적으로이 오류는 비정상적으로 길거나 모호한 ( "관리자") 클래스 이름과 같은 다른 코드 냄새와 관련이 있습니다. 정적 분석 도구는 과도한 구 심성 / 구 심성 결합을 쉽게 감지 할 수 있습니다.
행동과 반대로 데이터 주입은 poltergeist anti-pattern 의 하위 유형이며, 이 경우에는 geist가 컨테이너입니다. 클래스가 현재 날짜와 시간을 알고 있어야 DateTime
하는 경우 데이터 인을 삽입하지 않습니다 . 대신 시스템 시계에 추상화를 주입합니다 ( SystemWrappers 프로젝트 ISystemClock
에 더 일반적인 것이 있다고 생각하지만 일반적으로 mine 이라고 부릅니다 ). DI에만 해당되는 것은 아닙니다. 테스트 가능성에 절대적으로 필요하므로 실제로 기다릴 필요없이 시변 함수를 테스트 할 수 있습니다.
싱글턴으로서 모든 라이프 사이클을 선언하는 것은 화물 컬트 프로그래밍 의 완벽한 예이며 구어체로 명명 된 " 객체 cesspool "의 정도는 적습니다 . 나는 기억해야 할 것보다 더 많은 싱글 톤 학대를 보았으며, 그 중 DI는 거의 포함되지 않습니다.
또 다른 일반적인 오류는 IOracleRepository
컨테이너에 등록 할 수 있도록 구현 관련 인터페이스 유형 (예 : 이상한 이름 )입니다. 이것은 그 자체가 의존성 역전 원칙을 위반하는 것입니다 (인터페이스이기 때문에 실제로 추상적임을 의미하지는 않습니다). 또한 종종 인터페이스 분리 원칙 을 위반하는 인터페이스 팽창 을 포함 합니다.
내가 일반적으로 보는 마지막 오류 는 NerdDinner에서 수행 한 "선택적 종속성" 입니다. 다시 말해, 의존성 주입을 허용 하는 생성자가 있지만 "기본"구현을 사용하는 다른 생성자가 있습니다. 이것은 또한 딥을 위반 경향 으로 이어질 LSP의 , 시간이 지남에 따라, 개발자로서뿐만 아니라 위반 기본 구현 주위에 가정을 만들기 시작, 및 / 또는 기본 생성자를 사용하여 새로운 보내고 최대 인스턴스를 시작합니다.
이전의 말처럼, 당신은 모든 언어로 FORTRAN을 쓸 수 있습니다 . 의존성 주입은 의존성 관리를 나사에서 개발을 방지하는 묘책은 아니지만 않는 일반적인 오류 / 안티 패턴의 번호를 방지 :
...등등.
분명히 Unity 또는 AutoFac과 같은 특정 IoC 컨테이너 구현 에 의존하는 프레임 워크를 설계하고 싶지는 않습니다 . 다시 한번 DIP를 위반하는 것입니다. 당신은 자신도 그런 일을 생각 발견하면 의존성 삽입 (Dependency Injection)는 범용 종속성 관리 기술하고 있기 때문에, 그때 당신은 이미 여러 설계 오류를 만든 있어야 하지 IOC는 컨테이너의 개념에 묶여.
무엇이든 종속성 트리를 구성 할 수 있습니다. 어쩌면 그것은 IoC 컨테이너 일 수도 있고, 모의 무리를 가진 단위 테스트 일 수도 있고, 더미 데이터를 제공하는 테스트 드라이버 일 수도 있습니다. 귀하의 프레임 워크는 신경 쓰지 않아야하며 내가 본 대부분의 프레임 워크는 신경 쓰지 않지만 여전히 최종 사용자의 IoC 컨테이너에 쉽게 통합 될 수 있도록 종속성 주입을 많이 사용합니다.
DI는 로켓 과학이 아닙니다. 그냥 피하려고 new
하고 static
거기에 사용할 수있는 강력한 이유가 래퍼 상호 운용성 (예 : 아마도 프레임 워크 외부의 어떤 목적을 가지고 수없는 외부 의존성이없는 유틸리티 메소드 또는 유틸리티 클래스로, 그리고 사전 키의 일반적인 예입니다 경우를 제외하고 이).
개발자가 프레임 워크를 사용하는 방법을 처음 배울 때 IoC 프레임 워크와 관련된 많은 문제가 발생하며, 실제로 IoC 모델에 맞게 종속성 및 추상화를 처리하는 방식을 변경하는 대신 IoC 컨테이너를 조작하여 자신의 기대에 부응합니다. 오래된 코딩 스타일. 종종 높은 커플 링과 낮은 응집력이 필요합니다. 잘못된 코드는 DI 기술 사용 여부에 관계없이 잘못된 코드입니다.