종속성 주입을 적용하고 Dependency Inversion Principle을 준수 할 때 일반적인 조언은 to program to interfaces, not implementations입니다. 대부분의 시간은 당신이 구현에 추상화에서 이동 바인딩 볼 이유 :이 구성 요소가 컴파일시에 IWarrior
에 대한 종속성을 가지고 것을 의미합니다
Bind<IWarrior>().To<Samurai>();
을, 우리는 런타임에 Samurai
을 주입.
그러나 특정 조건 하에서는 구체적인 구성 요소에서 자체로 매핑하는 것이 좋습니다. 즉, '누군가'가 Samurai
을 요청하는 경우이를 Samurai
과 함께 제공합니다.
가장 중요한 경우는 루트 유형을 확인할 때입니다. 루트 유형은 종속성 그래프의 맨 위에 있습니다. 루트 유형은 컨테이너에서 직접 확인됩니다. 다른 모든 유형은 루트 유형의 직접 또는 간접 종속성입니다.
종종 이러한 루트 유형은 구체적인 유형으로 해결되며 종종 우리는 UI 프레임 워크를 다루고 있습니다. 웹 폼 Page
s, MVC Controller
s, 웹 API ApiController
s 등이 있습니다.
대부분의 DI 컨테이너를 사용하면 구체적인 등록되지 않은 유형을 확인할 수 있습니다. 이것은 자기 구속력이 중복된다는 것을 믿게 할 수도 있지만 항상 그런 것은 아닙니다. 이러한 바인딩을 명시 적으로 추가하면 컨테이너가 그러한 바인딩의 존재를 알 수 있습니다. 이것은 컨테이너의 진단 기능 (있는 경우)을 사용하여 객체 그래프에서 오류를 검사하는 이점이 있습니다. 이러한 기능이없는 경우 일반적으로 알려진 등록을 반복하고 단위 테스트 내에서 일부 확인을 수행 할 수 있습니다. 컨테이너의 등록이 반복 될 때 의미있는 검증이 이루어지기 위해서는 모든 루트 유형을 컨테이너에 등록해야합니다. 그렇지 않으면이 확인 과정에서 가음새가 발생합니다.
DI 컨테이너에 자동 바인딩을 알리는 또 다른 이유는 컨테이너가 등록되지 않은 유형을 확인할 수 없거나 컨테이너의 기본 라이프 스타일과 다른 라이프 스타일로 등록해야하는 경우입니다. 유형이 등록되지 않은 경우 대부분의 컨테이너는 Transient 인스턴스를 제공합니다.
프레임 워크에서 해결할 개체를 인식하게됩니다. 예를 들어'Bind() .ToSelf(). InSingletonScope();은 컨테이너가 그 타입이 싱글 톤으로 해석되어야한다는 것을 알린다. 이 모든 것은 컨테이너에 유형을 등록하는 일부일뿐입니다. –
Nkosi
하지만 해결해야하는 이유는 무엇입니까? 인스턴스를 생성자에 전달하면 해결할 필요가 없습니다. 또한'.InSingletonScope()'가 사용되었으므로 우리는 스스로 싱글 톤 패턴을 구현할 필요가 없습니까? – oflad
컨테이너가 인스턴스를 인스턴스화하고 있기 때문에 인스턴스를 생성하고 처리 할 수있는 유형을 알고 있어야합니다.의존성 반전 원리를 이해합니까? 컨테이너의 전체적인 점은 스스로 할 필요가 없다는 것입니다. – Nkosi