2012-02-09 5 views
3

가능한 중복 :
Inversion of Control < Dependency InjectionDI 및 IOC 예

사람이 나를 간단한 C# 예제와 DI 및 IOC 제발 이해하는 데 도움이 시겠어요? IOC은 제어 흐름의 반전 (나에게 아무 의미도 없음)이며 DI는 속성 또는 생성자를 통한 인터페이스 주입을 의미합니다. 이 두 가지는 어떻게 관련이 있는지 잘 모릅니다.

감사합니다.

답변

4

내가 도움이되었다는 설명을 추가하겠습니다.

올바르게 지적하자면, 의존성 주입은 생성자 또는 설정자 주입을 통해 공동 작업자에게 요구하는 클래스의 행위입니다. 이것을 코딩 기술로 생각할 수 있습니다. 반대로 컨트롤의 반전은 디자인 기법보다 더 중요합니다.

절차 적 프로그래밍 (및 OO 언어의 절차 적 프로그래밍)에서는 일반적으로 일종의 "명령 및 제어"철학이 있습니다. 각각 몇 개의 룸 오브젝트로 구성되는 3 개의 바닥 오브젝트로 구성되는 집 오브젝트를 작성하는 경우, 생성자가 3 개의 바닥 오브젝트를 인스턴스화하는 집 오브젝트를 작성합니다. 각각의 구성 오브젝트는 차례로 룸 오브젝트를 인스턴스화합니다.

컨트롤을 반전하면 명령 및 제어 패러다임을 뒤집을 수 있습니다. IoC를 사용하면 집을 인스턴스화 할 때 모든 세부 정보를 처리하지 않습니다. 대신, 생성자 (의존성 삽입)를 통해 "일부 바닥 없이는 인스턴스화 할 수 없습니다"라고 말합니다. 그래서, 당신은 바닥을 인스턴스화하기 위해 이동하고 그들은 "아니, 아니 일부 객실없이"라고. 자,이 "거꾸로 한"스타일에서, 우리 집은 방의 창작을 통제하지 않습니다. 그것은 다른 사람에게 그 것을 남겨 둡니다. 대신 표현 된 방과 함께하는 것만 표현합니다. 이는 명령과 컨트롤을 뒤집어 코드를 추론하고 테스팅하는 데 더 나은 솔기가 있기 때문에 바람직합니다. 모든 것을 구성 요소로 분해하는 것이 더 쉽기 때문입니다.

요약하면 통제의 반전은 철학이며 의존성 주입은 그것이 달성되는 수단입니다.

5

Dependency Injection in .NET 책을 읽는 것이 좋습니다. 자세한 내용은 포괄적 인 코드 예제의 모든면을 설명합니다. 통제 반전을 위해서 Robert Martin이 다른 책인 Agile Principles, Patterns, and Practices in C#을 참조해야합니다. 세부 사항은 예제와 이해할 수있는 설명이 포함 된 고체 원칙을 설명합니다. 이 두 권의 책은 제가이 원리들을 이해하는 데 정말로 도움이되었습니다.

+0

+1 용. 나는 그 원칙들에 관한 기본적인 질문들에 대답 할 수없는 많은 사람들을 인터뷰한다. – Ian

6

의 당신이 서비스를 필요로하는 클래스가 있다고 가정 해 봅시다 :

public class A 
{ 
    IEmailSender _emailSender 
    public A(IEmailSender emailSender) 
    { 
    _emailSender = emailSender; 
    } 

    private void SendEmail() 
    { 
    _emailSender.Send(); 
    } 
} 

클래스 지금, 그것의 수행 할 수 있도록 IEMailSender를 구현하는 객체를 필요로 IEMailSender에 종속 의미가 말한다 기능.

ninject 또는 autofac과 같은 종속성 주입 프레임 워크는 IEMailSender를 구현하는 객체를 생성하고 A의 생성자에 삽입하는 작업을 담당합니다. 단, 이러한 객체를 만드는 방법을 알려 주어야합니다.

예 Ninject에 사용 :

Bind<IEmailSender>().To<EmailSender>(); 

이 말하는 Ninject에, 클래스가 IEMailSender을 필요로 할 때마다, EmailSender을 그들에게 제공되는

이 내가하는 것만 큼 간단 (EmailSender가 IEMailSender 인터페이스를 구현하는 것을 당연히 가정) 생각하면 도움이되기를 바랍니다.

+0

좋아요. 이 코드에서 컨테이너 클래스를 어떻게 사용합니까? –

2

DI는 IoC이다. 반전 제어 란 작업이 어떻게 이루어지는지를 결정하는 교환을 의미합니다.

예전 세상에서는 Logger라는 클래스와 LogTime()이라는 클래스에 메서드를 만들 수 있습니다. 유일한 목적은 파일에 현재 시간을 쓰는 것입니다.

public void LogTime() 
{ 
    WriteToFile(GetCurrentTime()); 
} 

이 클래스에는 WriteToFile 및 GetCurrentTime이라는 메서드가 있습니다. IoC는 단순히 파일에 쓰는 방법을 결정하는 Logger 클래스 대신 현재 시간을 가져 오는 대신 외부 공급자가 이러한 세부 정보를 제공하도록 할 수 있음을 의미합니다.

그건 DI가 들어오는 곳입니다. 당신은 의존성을 주입합니다. 이 방법은 파일에 기록하고 현재 시간을 가져 오는 방법에 따라 다릅니다. 당신은 그 방법들을 주입합니다.

DI에는 속성 주입과 생성자 주입이라는 두 가지 공통 패턴이 있습니다. 그들은 주석에 대해 말하는 것을합니다. 방법은 주입을하는 특정 프레임 워크에 달려 있습니다.

일부 속성을 사용하고 일부는 설정 파일을 사용합니다. 일부는 최선의 추측 방법을 취합니다.

DI 옆에는 공손한 DI와 같은 SL (Service Location)이 있습니다. DI에서는 "이 의존성을 가지고 좋아해"라고 말합니다. SL을 사용하면 위의 Logger 클래스는 "이 종속성을 채우기 위해 뭔가를 가질 수 있습니까?"라고 말합니다. 만나다? 공손한.

작동시키기위한 핵심 요소는 인터페이스입니다. LogToFile은 ILogsToFiles 인터페이스의 메소드 일 수 있습니다. 그런 다음 해당 인터페이스에 대해 6 개의 서로 다른 구현을하고 가장 적합한 인터페이스를 삽입 할 수 있습니다.

이 모든 것을 관리 할 수있는 많은 프레임 워크가 있지만 단순한 ServiceLocator는 10 줄의 코드이며, 단순한 DI는 아마 두 배를 넘지 않습니다. 곧 여분의 것을 원할 것입니다. Ninject를 한번보세요. 나는 그것이 작고 단순하고 아마도 좋은 출발점이기 때문에 그것을 전적으로 추천한다.

관련 문제