0

저는 IOC 개념에 새로운 것이므로 다른 컨텍스트에서 다른 클래스를 해결하는 데 도움이된다는 사실을 이해합니다. 당신의 호출 클래스는 인터페이스와 인터페이스와 상호 작용할 것이고, 당신에게 어떤 구현이 주어 졌는지를 결정할 것이고, 객체를 새롭게 처리 할 것입니다.IOC 및 바인딩을 이해하려고 시도합니다.

내 질문은 그 기반으로하기 때문에 이해가 잘못 생각하는 경우 정정 해줘 제발 :이 도움이 이해

private readonly IEmailService emailService; 
private readonly ITemplateRenderer templateRenderer; 
private readonly IHtmlToTextTransformer htmlToTextTransformer; 

public TemplateEmailService(IEmailService emailService, 
    ITemplateRenderer templateRenderer, 
    IHtmlToTextTransformer htmlToTextTransformer) 
{ 
    this.emailService = emailService; 
    this.htmlToTextTransformer = htmlToTextTransformer; 
    this.templateRenderer = templateRenderer; 
} 

: 이제

, 나는이 프로젝트에 매우 자주이 패턴을 참조 새 클래스를 사용하지 않고 이러한 클래스의 모든 구현을 사용하고 IOC가 구현할 구현을 결정할 필요가 없습니다.

하지만이 코드는 IOC 구성 파일을 건드리지도 않습니다. 그리고 다시 나는 2 일 동안 자식을 보내고 있지만, 읽은 모든 튜토리얼에서 "아이를 결정해라."라는 말을 구성하기를 기대했다. 그러나 그것은 나 같은 것이 없어도 작동합니다. 이 인터페이스의 구현이 하나뿐이기 때문입니까? 그리고 만약 내가 하나 이상의 구현을하고 다음에만 내가 명시 적으로 해결할 구성해야 할 것인가?

+0

글쎄, 나는 생각했다. 특정 인터페이스의 유일한 구현이있을 때, IOC는 독자적으로 알아낼 것이다 (최소한 구조지도는 그렇게한다). 명시 적 구성은 여러 구현이있는 경우에만 수행해야합니다. – TeaLeave

+1

일부 IoC 및 DI 프레임 워크는 "컨벤션 오버 컨벤션"패러다임을 사용합니다. 따라서 인터페이스를 구현하는 IFoo와 Foo 클래스가 있다면이 프레임 워크는 IFoo를 구현하는 다른 클래스가 있어도 IFoo를 Foo로 해석합니다. 실제로 그것은 더 복잡 할 수 있지만 이것은 주요 아이디어입니다. 나도 알다시피, 원래 Ruby On Rails에서 구조화되었으며 구조 맵에서도이를 지원합니다 (http : // codebetter.com/jeremymiller/2009/01/20/create-your-own-auto-registration-convention-with-structuremap /) – Nikolay

답변

4

코드 샘플은 Constructor Injection입니다. 기존의 코드에서

, 당신은 매개 변수가없는 생성자를 가지고 있고, 것 같은 그 안에 당신 것 "새로운 업의"개체 :

IEmailService emailService = new EmailService(); 

그래서 코드가 명시 적으로 할당됩니다 구현이 제어하는 인터페이스 변수.

생성자 주입을 사용하는 IoC에서 컨트롤은 반전되어 컨테이너가 "버스를 운전하고"TemplateEmailService 객체를 생성한다는 것을 의미합니다. 컨테이너를 만들려고 할 때 컨테이너는 생성자 매개 변수 (IEmailService, ITemplateRenderer 등)를보고 클래스에 해당 객체를 제공합니다.

인터페이스 A가 구현 B (또는 C)에 의해 명시 적으로 충족되도록 IoC 컨테이너를 구성 할 수 있습니다. 각각은 그것을 할 방법이 있습니다. 또는 규칙에 따라 (Foo에서 IFoo가 수행함) 또는 클래스의 속성을 사용하여 작업을 수행 할 수 있습니다.

귀하의 질문에 대답하십시오 - 특정 인터페이스를 수행하는 데 사용되는 구현을 명시 적으로 정의 할 수 있습니다. 방법에 대한 IoC 컨테이너 문서를 읽었습니다.

"이 코드를 작성할 때"기술적으로 IoC 컨테이너를 사용할 필요가 없습니다. 사실, 클래스는 컨테이너에 대한 직접적인 참조를 가져서는 안됩니다. 이는 재사용 가능성을 극대화하고 쉬운 테스트를 허용합니다. 따라서 다른 곳의 구현 클래스에 대한 인터페이스를 와이어 업 할 수 있습니다.

+0

설명 해 주셔서 감사합니다. 도움이되었습니다. – TeaLeave

관련 문제