2011-01-14 4 views
2

가능한 중복 :
What is dependency injection?의존성 주입이란 무엇입니까?

임 학습의 asp.net MVC 의존성 주입되는 새로운 기능 3. 하나. 누군가 그게 뭔지 말해 줄 수 있니? 왜 그렇게 유용합니까? 그것을 언제 사용할 수 있습니까? 아마 프로그래머 적합하지만, 처음 배울 제어

http://en.wikipedia.org/wiki/Inversion_of_control

http://www.martinfowler.com/articles/injection.html

의 반전에 대한 감사

+3

중복 [의존성 주입 무엇입니까?] (http://stackoverflow.com/questions/ 130794/what-is-dependency-injection) – jfar

답변

2

아이디어 구성 요소가/도착하는 방법에 대해 알고 종속성을 만들 수 없습니다해야한다는 것입니다, 그 일을 끝내기 위해 필요한 것을 제공해야합니다.

6

종속성 주입은 개체 자체를 인스턴스화하는 코드 대신 종속 코드가 코드 소비에 제공되는 프로세스입니다. 원시적 인 예제에서는 렌더링 된 서비스에 대한 송장 계산을 담당하는 클래스가있을 수 있습니다. 당신은 그것을 설명하고 '계산'방법을 호출합니다 :

public class InvoiceBiller 
{ 
    public void Bill() 
    { 
     Calculator calculator = new Calculator(); 
     var totalAmountDue = calculator.CalculateBill(hoursWorked); 
    } 
} 

이 방법은 Calculator 클래스에 따라 다릅니다. 괜찮습니다. 작동합니다. 그러나 depenedency 주입하면 계산기 의존성를 "주입"할 것이다 :

public class InvoiceBiller 
{ 
    private readonly Calculator calculator; 

    public InvoiceBiller(Calculator calculator) 
    { 
     this.calculator = calculator; 
    } 

    public void Bill() 
    { 
     var totalAmountDue = calculator.CalculateBill(hoursWorked); 
    } 
} 

을 당신이 InvoiceBiller 클래스는 생성자 (생성자 주입라고 의존성 주입의 한 형태)을 통해 계산기 객체를 주어진 두 번째 예에서 볼 수 있듯이. InvoiceBiller는 더 이상 청구자의 인스턴스를 가져 오는 방법과 관련이 없으며 간단히 주어집니다.

테스트에 도움이됩니다. 테스트에서 원하는 모든 계산기 인스턴스를 전달할 수 있습니다. 실제 제품의 런타임시 데이터베이스에 연결된 계산기를 전달하여 시간당 요금을 조회 할 수 있습니다. 테스트를 위해 하드 코딩 된 속도를 사용하는 계산기를 전달하므로 테스트가 데이터베이스에 도달 할 필요가 없습니다. 한 단계 더이 촬영

, 당신은 일반적으로 대신 구체적인 유형의 인터페이스에 전달합니다

public class InvoiceBiller 
{ 
    private readonly ICalculator calculator; 

    public InvoiceBiller(ICalculator calculator) 

이제 인터페이스하지 구현에 대해 프로그래밍을하고 있습니다. 다시 테스트에서 모의 ​​프레임 워크를 사용하여 인터페이스 유형의 모의 객체를 만들어 클래스에 전달할 수 있습니다.

3

사실 여기에는 두 가지 질문이 있습니다. "Dependency Injection이란 무엇입니까?" 및 "MVC 3의 새로운 기능은 'Dependency Injection support?

종속성 주입은 클래스가 사용하기 전에 다른 클래스의 새 객체를 정의하지 않을 때 프로그래밍 패턴입니다 (예 : DB의 전자 메일을 로깅해야하는 일부 전자 메일 보낸 사람 클래스는 로거의 새 인스턴스를 만들지 않음). 요청 어떤 클래스인지 알지 못해도 제공 될 수 있습니다 (인터페이스를 사용하여 우리의 경우 ILogger를 말하십시오). 여기에있는 로거는 의존성이 될 것이고이 종속성은 여러 가지 방법으로 종속 클래스의 생성자 매개 변수 (예 : EmailSender)로 요청되거나 클래스 "설정"접근 자의 속성으로 지정되거나 요청되거나 여러 방식으로 요청/주입됩니다. 기타...

Dependency Injection libraries 또는 Inversion Of Control Container라고하는 라이브러리가 있습니다. 그것들은 실제로 런타임에 어떤 클래스가 사용되어야하는지, 그리고 어떤 다른 특정 값을 사용해야하는지 정의하는 라이브러리이며, 모든 종속성을 재귀 적으로 전달하는 (예 : EmailSender의 인스턴스 작성과 같은) ILogger가 실제로 연결 문자열을 필요로하는 DBLogger 일 경우 ILogger도 그것을 보냅니다.).
http://tekpub.com/view/concepts/1

: 예는 샘플 코드 및 더 명확 예를 들어

, ASP.NET MVC 팀에서 작동하는 데 사용되는 사람에서이 좋은 무료 동영상보기 ... 윈저, Ninject에, Autofac, 마이크로 소프트 유니티이다

ASP.NET MVC는 컨트롤러 클래스 작성 방법을 재정의 할 수있는 팩토리 클래스를 항상 허용했습니다. 따라서 DI 컨테이너 라이브러리를 사용하여 컨트롤러 및 해당 종속성을 마치 EmailSender 클래스처럼 만들 수 있습니다. 무엇 ASP.NET MVC 3.0에서왔다하면 기존 기능을 통해 개선과 같은 많은 방법을 제공 하였다는 모든

ASP.NET MVC 3 Service Location: Views (Part 3)

  • ASP.NET MVC 3 Service Location: Filters (Part 4)
  • 깊은 자세한 내용을 확인하세요 ...의