2012-02-06 3 views
14

종속성 주입에 ninject를 사용하여 결과가 MVC에서 얻을 수있는 주입과 같은 방식으로 사용할 수 있습니까? 정교하게, 만약 MVC ninject adapter를 사용한다면 웹 컨트롤러에 생성자 파라미터를 선언 할 수 있습니다. 생성자 파라미터는 자동으로 ninject에 의해 주입됩니다.WPF에서 Ninject 생성자 삽입

그러나, 나는 이와 같은 창문이 저를 가능하게 할 WPF에 대한 이러한 Ninject에 확장, 발견되지 않은 :

public partial class MainWindow : Window 
{ 
    private readonly IService injectedService; 
    public MainWindow(IService injectedService) 
    { 
     this.injectedService = injectedService; 
    } 
} 

내가 명시 적으로 IKernel를 사용하지 않고이 작업을 수행하고자하는 내 mainwindow의 인스턴스를 얻기위한 메인 애플리케이션 시작. 주 윈도우 및 모든 후속 윈도우의 인스턴스를 얻으려면 xaml 구성의 일반적인 방법을 사용하는 것을 선호합니다.

이것이 가능합니까? 생성자 종속성 주입을 위해 Ninject를 사용하도록 xaml에 의해 생성 된 객체 생성에 연결하는 방법이 있습니까?

+2

WPF에서는 일반적으로 MVVM 패턴을 사용하므로 ViewModel 클래스에 서비스가 삽입되므로 이러한 확장이 존재하지 않는다고 생각합니다. –

+0

그러나 모델 자체가 XAML을 통해 만들어지지 않았습니까? 틀림없이 WPF에 대한 전문가는 아니지만 모델에 종속성 주입과 같은 종류의 제품이 필요하지 않습니까? 프로젝트의 단위 테스트를 방해하는 컨테이너 표시에 대해 우려하고 있습니다. – Dervall

+3

아니요, ViewModels은 XAML에서 만들어지지 않습니다. 그것들은 ViewModelLocator에서 생성됩니다. 예제는 [here] (http://windowsphonegeek.com/articles/Working-with-a-simple-ViewModelLocator-from-MVVM-Lite)에서 볼 수 있습니다. 뷰 또는 ViewModel은 종속성 주입 컨테이너에 대해 아무것도 모릅니다. –

답변

17

의견을 바탕으로 & 혼란 스러울지라도 MVVM이 당신에게 어울리는 것 같습니다. 문제는 MVVM을 배우는 것입니다.

따라서 균열이 열리고 good link이되어 압연됩니다. MVVM은 놀라 울 정도로 쉽게 수행 할 수 있으며, Ninject로 모든 것을 랩핑하고 그것에 활을다는 것은 꽤 쉽습니다.

Ninject + MVVM 용 타사 라이브러리를 사용하지 않으면 초기 학습 곡선이 약간 가파르게됩니다.

<Application.Resources> 
    <ioc:NinjectServiceLocator x:Key="ServiceLocator" /> 
</Application.Resources> 

이 약간의 트릭은 당신이 할당 할 수 있습니다 :

 DataContext="{Binding Path=ResultViewModel,Source={StaticResource ServiceLocator}}" 

이 작은 또한이 만드는 당신이 당신의 XAML에서의 ViewModel 정보를 얻을 수 Ninject에 트리거 할 수 있습니다 : 그래서 여기에 몇 가지이야 이해했다 app.xaml 파일에서 관련 클래스로 staticresource

public class NinjectServiceLocator 
{ 
    private readonly IKernel kernel; 

    public NinjectServiceLocator() 
    { 
     kernel = new StandardKernel(new MyMvvmModule()); 
    } 

    public ResultViewModel ResultViewModel 
    { 
     get { return kernel.Get<ResultViewModel>(); } 
    } 
} 

이것은 주목할만한 내용입니다. 모든 뷰 모델은 Ninject가 생성하기 위해 ServiceLocator에 속성으로 나열되어야합니다. 마지막으로 위의 예제에서 MyMvvmModule은 Load()에 대한 재정의 (override)를하고 모든 인터페이스를 바인딩하는 표준 Ninject 클래스입니다.

+0

감사합니다. 매우 도움이됩니다. – Dervall

+1

@Dervall Thanks. 이 게시물은 제프 앳 우드가 그렇게 생각한 게시물입니다. 비슷한 문제가 있었기 때문에 몇 시간 동안 조사한 후에 알게 된 정보를 공유하여 이후에 많은 사람들이 저에게 희망을 가지기를 바랍니다. – deltree