2009-07-20 8 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. は、コード内のMapViewをインスタンス化します。 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のプロパティを介して)値を渡す注射可能なパラメータ/プロパティを追加し、Get<GameWindow>()を使用します。欠点:今私は手作業でDIフレームワークが私のために自動化されるはずのものです。

  4. GameWindowをインスタンス化した後、論理ツリーを歩き、IKernel.Inject()をすべて呼び出します。反対側:再び、私はInject()が私の思うことをしているのか、それともここで適切かどうかはわかりません。呼び出し側は、GameWindowのインスタンスを作成した後に、視覚的にツリーを挿入することを忘れてはなりません。

これを行うより良い方法はありますか?たぶん、NinjectのWPF拡張で、Get<GameWindow>()を実行し、#4のような論理ツリーを自動的に歩き、すべてのプロパティを注入しますか?そのようなことがなければ、私はそれを書くことが可能でしょうか?

あなたはWPFでNinjectを使ってどのようにアプローチしますか?上記の方法のいずれかを使用していますか?そうであれば、わからないことを共有できますか?より良いアプローチがありますか?

答えて

4

1)が最適です。また、Mapview関数のための便利なエントリーポイントであることがわかります。

また、カーネルを渡すのではなく、GameWindowでGameWindow>()と[inject]を実行するだけでkernel.Get <を実行してください。

+0

コントロール自体を注入することは決してありませんでしたが、今は明らかです。ありがとう! –

関連する問題