나는 Daniel Cazzulino's 시리즈 약 building a DI container using TDD을 팔로우하고 있습니다. part five of the series에서 그는이 기능을 유용하게 만드는 요소에 대해 언급하지 않고 컨테이너 계층 구조에 대한 지원을 추가합니다. 많은 DI 프레임 워크에서 계층 구조에 대한 지원에 대해 언급 한 적이 있지만 사용시기와 이유를 이해하는 데 어려움을 겪고 있습니다. 누군가 통찰력을 제공 할 수 있습니까?Dependency Injection 프레임 워크가 컨테이너 계층 구조를 지원하는 이유는 무엇입니까?
답변
Here's a sample Matt가 설명한 것과 유사한 시나리오에서 하위 컨테이너를 사용합니다. 하위 컨테이너를 사용하여 다른 데이터베이스 구성을 선택합니다.
열쇠는 여기에 대부분의 구성은 (일부는 부모 컨테이너에 속하는 공유하는) 자식 컨테이너 사이에 공유되고 있다는 것입니다
나는 같은 질문을하는 kzu의 블로그에 의견을 남겼다. 그런 기능을 코딩하기 전에 유스 케이스를 명확히하지 않은 것은 유감스러운 일이다.
내가 생각할 수있는 유일한 점은 앱의 다른 부분에서 컨테이너에서 다른 유형을 확인하려고했다는 것입니다. 예를 들어, 두 개의 개별 섹션이있는 주문 입력 시스템이 있고 각 섹션이 동일하고 다른 제품 목록을 제시해야하는 경우 각 섹션에 대해 하위 컨테이너를 만들고 사용자의 등록을 "무시"할 수 있습니다 각각의 제품 저장소. 섹션이 제품 저장소 (또는 하나에 의존하는 항목)를 해결하려고 할 때마다 부모가 아닌 하위 컨테이너에 설정 한 인스턴스를 가져옵니다. 가상 메서드를 재정의하는 것과 비슷합니다.
이 방법은 근거가 될 수는 없지만 내가 생각해내는 것이 가장 좋습니다.
의존성 주입 완전히 프로젝트에 의해 수용되는 경우 하위 컨테이너를 가진 좋은 이유가 . 서로 다른 두 시스템의 메시지를 처리하는 응용 프로그램을 상상해 봅시다. 대부분의 처리는 유사하지만 이러한 시스템과의 호환성을 지원하는 변형이 있습니다. 우리의 목표는 우리가 할 수있는 코드를 재사용하는 것입니다. 요구 사항이 다른 코드를 작성하는 것은 다릅니다.
OO 프로그래밍에서 우리는 시스템 요구 사항을 충족시키기 위해 협력 할 일련의 클래스를 연결합니다. DI 컨테이너는 이러한 책임을집니다. 메시지가 시스템에서 도착하면 특정 시스템의 메시지 처리에 적합한 일련의 공동 작업 클래스를 작성하려고합니다.
두 시스템간에 차이가없는 항목이있는 최상위 컨테이너가 있습니다. 그런 다음 시스템간에 을 수행하는 하위 컨테이너가 개 있습니다. 메시지가 도착하면 적절한 어린이 DI 컨테이너에 messageProcessor
을 요청합니다. 해당 컨테이너의 구성에 따라 (필요에 따라 상위 컨테이너로 폴백) DI 프레임 워크는 해당 시스템에 대한 messageProcessor (적절한 공동 작업자가 지원하는 객체)를 반환 할 수 있습니다.
확실한 답이 아닌 경우 의견을 남겨주세요. 또한 "로봇 다리 문제"를 검색 할 수 있습니다. 각 다리는 동일하지만 왼발이 필요하고 다른 다리는 오른발이 필요합니다. 우리는 각 다리마다 아동 DI 컨테이너를 가질 수 있습니다.
중첩 된 컨테이너에 대해 알고있는 가장 좋은 예는 윈도우 시스템입니다. 각 탭/창에 부모 컨테이너의 전역 종속성을 상속하는 모든 창 컨테이너가있는 다른 탭/창과 독립적 인 자체 컨테이너를 갖도록 각 탭/창을 구분하는 것은 매우 좋습니다.
대부분의 경우 각 중복 탭/창에 대한 다양한 클래스의 인스턴스가 필요하므로 중복되는 탭/창을 사용하는 경우에 특히 필요합니다.