2012-02-06 23 views
14

依存性注入にninjectを使用すると、結果がMVCで取得できる注入のようになりますか?具体的には、MVCのninjectアダプターを使用すると、Webコントローラーをコンストラクター・パラメーターとして宣言することができます。このパラメーターは、自動的にninjectによって注入されます。WPFでのNinjectコンストラクタの注入

しかし、私はこのようなウィンドウ持っているように私にできるようになるWPFのために、このようなninject延長、発見していない:

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

は、私が明示的にIKernelを使用せずにこれを実行したいと思いますが、私のmainwindowのインスタンスを取得するためのメインアプリケーションの起動。私は主ウィンドウとすべての後続のウィンドウのインスタンスを取得するために、xaml構成の通常の方法を使用する方が好きです。

これは可能ですか? xamlによって生成されたオブジェクトの作成をフックして、Ninjectを使用してコンストラクタの依存性注入を行う方法はありますか?

+2

WPFでは通常、MVVMパターンを使用しており、サービスをViewModelクラスに挿入するため、このような拡張は存在しません。 –

+0

しかし、XAMLを介して作成されたモデル自体はありませんか?確かに、私はWPFの専門家ではありませんが、モデルは従属注入と同じ種類のものを必要としませんか?私はコンテナを見せてプロジェクトの単体テストを妨げることに懸念しています。 – Dervall

+3

いいえ、ViewModelは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用のサードパーティライブラリを使用しないと、最初の学習曲線は少し険しいです。この小さな追加が可能

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

あなたのXAMLからあなたのviewmodelの情報を取得するためにninjectトリガすることができます::だからここに私は理解していた物事のカップルだ

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

この小さなトリックはあなたが割り当てることができますあなたの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がそれらを生成するためには、すべてのviewmodelをServiceLocatorのプロパティとしてリストする必要があります。最後に、上の例のMyMvvmModuleは標準のNinjectクラスです。ここでは、Load()のオーバーライドをスティックし、すべてのインターフェイスをバインドします。

+0

ありがとう、非常に有用 – Dervall

+1

@Dervallありがとう。このようなポストは、私がJeff AtwoodがSOのために想像したものです。私も同様の問題があったので、何時間も調査した後に知った情報を共有して、今後誰かを救うことができればと思います。 – deltree

関連する問題