2012-06-03 3 views
2

저는 패턴을 핵심 패싯으로 나누고 그 패싯을 하나씩 학습하여 MVVM 패턴을 가르치는 과정에 있습니다.MVVM 의존성 주입

제 질문은 의존성 주입과 관련되어 있습니다. 그것은 무엇이며, 왜/언제 사용해야합니까? 제이슨 돌린 저 (Jason Dolinger)의 뛰어난 MVVM 소개 비디오를 살펴 봤는데 Unity를 사용하고 있습니다. 이것은 이상하게 들릴지 모르지만 Unity를 사용하지 않고 어떻게 의존성 삽입을 구현합니까? 기본적으로 의존성 삽입 개념을 이해하고 다른 프레임 워크/도구 (지금은)를 구현할 필요없이이를 사용하는 방법을 이해하고 싶습니다.

감사합니다.

답변

2

프레임 워크를 사용하지 않고 DI를 이해하고 싶다면 머리를 감싸는 것이 그리 어렵지 않습니다.

교통 수단을 이용하려고한다고 가정 해 보겠습니다.

interface ITransportation 
{ 
    Transport(); 
} 

과 같을 수 있습니다 교통의 양식을 사용하는 방법의 초기 구현 :

public void Move() 
{ 
    ITransportation car = new Car(); 
    car.Transport(); 
} 

그 방법의 문제는 이제 Car 클래스에 의존한다는 것이다. 우리는 더 나은 유연성을 위해 우리 운송 대상을 통과시켜야합니다. 이것은 통제의 반전이며 DI와 밀접한 관련이 있습니다.

public void Move(ITransportation tr) 
{ 
    tr.Transport(); 
} 

자세히 알 수 있듯이 특정 DI 프레임 워크에 대해 알 필요가 없습니다. 자습서 ninject DI by hand도 확인하시기 바랍니다.

+0

앤디 감사합니다. 뷰와 뷰 모델의 컨텍스트에서 종속성 주입이 기본 뷰 모델에서 뷰를 "분리"하는 데 사용된다고 설명하는 것이 맞습니까? – user823486

+0

조금 더 많은 문맥이 도움이 될 수 있습니다. 우리는 WPF/Silverlight 또는 다른 것을 말하고 있습니까? –

+0

안녕하세요. 나는 WPF의 맥락에서 DI를 연구하고있다. – user823486

0

그냥 (일반적으로 계층 구조에서 발견)

의존성 삽입 (Dependency Injection) 종속성의 디커플링을 달성하기 위해 Dependency Inversion Principle

의 형태 중 하나입니다 앤디의 대답 @ 연장, DI는 일반적으로 인스턴스에 사용됩니다 기본 new() 및 Factory 메소드와 같은 패턴과 같은 시나리오. 매번 새로운 의존성 인스턴스를 삽입 할 수있을뿐만 아니라 (예 : 공장과 같이) 명명 된 인스턴스, 싱글 톤 인스턴스 등을 주입하도록 컨테이너를 설정할 수도 있습니다. 즉, IoC 컨테이너는 대개 객체의 수명 관리를 담당합니다 게다가.

잠재적 인 '사고 방식 전환'은 DI가 일반적으로 생성자 또는 공개 Get/Set 속성을 통해 주입하므로 종속성이 현재 구체적인 클래스에서 공개적으로 표시 될 수 있다는 것입니다. OO 캡슐화를 사용하는 경우 클래스의 종속성이 구현으로 간주되며 '외부'즉 클래스 메소드 서명에서 숨겨져 야하는 경우 이상하게 보일 수 있습니다. 그러나 Interface/Concrete 클래스 분리를 ​​구현하면 (디커플링뿐 아니라 테스트/조롱 목적으로도) 주입 생성자/속성 삽입 메소드가 인터페이스에 없으므로 캡슐화가 다시 이루어집니다.

재 : "손으로 DI를하는"유니티가없는 등

당신이 할 필요가있을 것이다 것은 다음 클래스의 인스턴스를 '구축'에 대한 책임이 자신의 IoC 컨테이너를 코딩하는 것입니다 - 각시 '빌드 업'을 수행하면 클래스에 종속성 검사 (예 : 구성, 속성 또는 단순한 관례에 따라 컨테이너에 구성됨, 예를 들어 모든 공용 설정 가능 특성 또는 생성자의 클래스 매개 변수는 의존성이 있음).그런 다음 필요에 따라이 '종속성'인스턴스를 객체에 삽입합니다 (예 : 리플렉션 사용). 그런 다음 재귀 적으로 이러한 종속성의 모든 종속성을 구축해야합니다. 그런 다음 각 객체에 수명 관리를 제공해야합니다. 싱글 톤 등