2009-07-20 10 views
12

종속성을 주입하려는 WPF UserControl이 있습니다. Ninject으로이 작업을 수행하는 가장 좋은 방법은 무엇입니까?Ninject를 사용하여 WPF에 종속성 주입

구체적인 예를 들면 : MapView라는 UserControl이 있는데, 생성자 또는 속성 삽입을 통해 내 IDialogueService의 인스턴스를이 인스턴스에 주입하려고합니다. 현재, 내가 어떤 의존성 주입을 사용하지 않는, 내 컨트롤이 XAML에서 생성됩니다

<Window x:Class="GameWindow" ...> 
    <Grid Name="root"> 
     <MapView x:Name="mapView" ... /> 
     <!-- other stuff here --> 
    </Grid> 
</Window> 

가 IKernel를 생성하고, IDialogueService 바인딩, 충분히 간단합니다. 하지만 커널을 사용하여 MapView에 의존성을 주입하는 방법에 대해 고민하고 있습니다. 나는 여전히 Ninject의 총 초보자이기 때문에 내가 놓친 게 분명해.

나는이 문제를 해결하기 위해 여러 가지 방법을 생각할 수 있습니다

  1. 이 코드에서지도보기를 인스턴스화. XAML에서 <MapView ... />를 제거하고 대신 GameWindow의 생성자이 추가 :

    public GameWindow(IKernel kernel) { 
        root.Children.Add(kernel.Get<MapView>()); 
    } 
    

    단점 : XAML을 사용하지 않는에서 여분의 복잡성 GameWindow는 IKernel에 의존합니다.

  2. XAML에서 인스턴스화를 유지하고, 대신에 속성 주입을 사용

    public GameWindow(IKernel kernel) { 
        kernel.Inject(mapView); 
    } 
    

    단점 : Ninject에 워드 프로세서를 주입() "대부분의 경우에 사용되어서는 안된다"라고, 그래서 나는 알지도 못하는 만약 내가 생각하는대로하면, 아니면 여기에서 사용하는 것이 합리적인지. 그리고 GameWindow는 여전히 IKernel에 의존합니다.

  3. GameWindow에 값을 MapView에 전달하는 주입 가능 매개 변수/속성을 (아마도 MapView의 속성을 통해) 추가 한 다음 Get<GameWindow>()을 사용합니다. 단점 : 이제 수동으로 DI 프레임 워크가 나를 위해 자동화해야하는 부분에 의존성을 수동으로 전달합니다.

  4. GameWindow를 인스턴스화 한 후에는 논리 트리를 걸어 IKernel.Inject()를 호출하십시오. 단점 : 다시 말해, Inject()가 내가하는 일을 생각하는지, 아니면 여기에 적합한 지 여부를 모르겠습니다. 호출자는 GameWindow를 인스턴스화 한 후 walk-the-visual-tree-and-inject 것을 수행해야합니다.

더 좋은 방법이 있나요? 어쩌면 Get<GameWindow>()을 할 수있게 해주는 Ninject 용 WPF 확장 기능을 사용하고 (# 4와 같이) 나를 위해 논리 트리를 자동으로 이동하여 모든 것에 속성 주입을 수행 할 수 있습니까? 그러한 것이 존재하지 않는다면, 그것을 쓸 수 있습니까?

여러분은 WPF로 Ninject를 사용하여 어떻게 접근합니까? 위의 방법 중 하나를 사용합니까 (그렇다면 내가 모르는 부분을 공유 할 수 있습니까)? 더 나은 접근법이 있습니까?

답변

4

1)이 가장 좋습니다. 또한 Mapview 기능의 편리한 시작점입니다.

또한 커널을 전달하는 대신 커널을 수행하십시오. GameWindow에서 GameWindow>() 및 [inject] MapView를 실행하십시오.

+0

컨트롤을 주입해도 절대로 나에게 일어난 일이 아니지만 지금은 분명합니다. 감사! –

관련 문제