2010-06-22 4 views

답변

4

핵심 요소 인 DI 컨테이너는 인터페이스와 콘크리트 유형 간의 매핑을 기반으로 객체를 생성합니다. 이것은 당신이 컨테이너에서 추상 형식을 요청할 수

:

IFoo f = container.Resolve<IFoo>(); 

이것은 당신이 예를 푸 위해 (IFoo를 구현하는 구체적인 클래스에 IFoo에서 매핑 컨테이너를 구성 이전에 있어야합니다).

자체가 특히 인상적 않겠지 만 DI 컨테이너는 더 많은 일을 할 :

  • 그들은 그들이 자동으로 IFoo 푸에 매핑하고있는 경우 IBar가 매핑 알아낼 수 있다는 것을 의미한다 자동 배선를 사용 Bar,하지만 Foo는 IBar에 의존성이 있습니다. IFoo를 요청하면 Foo 인스턴스가 만들어집니다.
  • 구성 요소의 평생을 (를) 관리합니다. 매번 Foo의 새로운 인스턴스를 원하지만, 다른 인스턴스에서는 동일한 인스턴스를 원할 수도 있습니다. 매번 Foo의 새로운 인스턴스를 원할 수도 있지만 주입 된 Bar는 같은 인스턴스로 남아 있어야합니다.

수동 구성 당신이

많은 DI 컨테이너 위보다 훨씬 더 많은 일을 할 수있는 DI 컨테이너 :)으로 제공하는 서비스를 감상 시작해야수명을 관리하려고 시작하지만 그 후 핵심 서비스입니다. 대부분의 컨테이너는 configuring via either code or XML에 대한 옵션을 제공합니다.

컨테이너의 사용에 관해서는 Krzysztof Kozmic이 방금 a good overview을 게시했습니다.

2

DI 컨테이너를 구성하면 인터페이스와 유형, 즉 각 인터페이스가 유형에 매핑되는 방식을 알 수 있습니다.

Resolve을 호출하면 매핑을보고 요청한 매핑 된 개체를 반환합니다.

일부 DI 컨테이너는 구성에 대한 규칙을 사용합니다. 예를 들어 인터페이스 ISomething을 정의하면 인스턴스화하고 반환 할 구체 Something 유형을 찾습니다.

+0

쇼트 & 스위트 & 유독 자동차 무료! – Shog9

4

는 "그것은 개체의 멋진 해시 테이블보다 더 아무것도 없다."

을 위에서 그들에 대해 생각하는 쉬운 방법 대규모 삼가된다. 컬렉션이 주어지면 클래스의 동일한 인스턴스를 요청하면 DI 컨테이너가 캐시 된 버전이나 새 버전을 제공할지 여부를 결정합니다.

의존성을 배선 할 때 그 사용법을 사용하면 더 쉽고 깨끗하게 정리할 수 있습니다. 다음과 같은 의사 클래스가 있다고 상상해보십시오. 집을 건설

class House(Kitchen, Bedroom) 
    // Use kitchen and bedroom. 
end 

class Kitchen() 
    // Code... 
end 

class Bedroom() 
    // Code... 
end 

는 DI 컨테이너없는 고통, 당신은 부엌의 인스턴스 다음에 침실의 인스턴스를 생성 할 필요가있다. 이러한 객체에 종속성이있는 경우 해당 객체를 연결해야합니다. 차례 차례로 객체를 연결하는 코드를 여러 줄 쓸 수 있습니다. 그래야만 유효한 집을 만들 수 있습니다. 집 객체를 원한다고 말하는 DI/IOC (Inversion of Control) 컨테이너를 사용하면 DI 컨테이너가 각각의 의존성을 반복적으로 만들고 집을 반환합니다. DI/IOC 컨테이너없이

:

DI와
house = new House(new Kitchen(), new Bedroom()); 

/IOC 컨테이너 : 하루의 끝에서

house = // some method of getting the house 

는 쉽게 코드를 작성하고 책임을 이동하는, 쉽게 따라 할 수 있도록 문제를 해결할 수 있도록

+0

DI는 사용자가 자신의 복잡한 생성자와 자신의 코드를 작성하지 않아도되고 여러 가지를 구성하는 것을 멈추게하므로 좋은 점에 유의해야합니다. 예, 필요하지는 않지만 기존 라이브러리를 활용하여 모든 것을 처리 할 수 ​​있다면 좋을 것입니다. 자바 애플리케이션 구성 (C ​​#은 전문 지식 영역이 아닙니다)은 가난하고 일관성이없고 복잡한 스크립팅 언어로 작업하는 것처럼 보입니다 ... –

관련 문제