2017-08-23 7 views
1

私はNinjectに入っています。デフォルトコンストラクタを介してAをインスタンス化Ninject:第2レベルの内部依存を解決する

public class NinjectBindings : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IMasterViewModel>().To<IQMasterViewModel>(); 
    } 
} 

public class A 
{ 
    [Inject] 
    public IMasterViewModel _viewModel 
    { 
     get; 
     set; 
    } 

    public A() 
    { 
    } 
} 

とクラスB:

public class B 
{ 
    public A a = new A(); 
} 


Ninject.IKernel kernel = new StandardKernel(new NinjectBindings()); 
var b = kernel.Get<B>(); 

私はNinject.kernellを使用して、クラスBを解決しようとすると、私の本当のシナリオの簡素化、私はクラスプロパティインジェクションとAを持っています.Get()はクラスAの依存関係をAインスタンスに注入しないことを呼び出します。 オブジェクトAがインスタンス化される方法を変更できない場合、そのような注入を処理する正しい方法は何ですか? 実際のシナリオでは、クラスBはWPFウィンドウであり、クラスAはXAMLで宣言されたUserControlです。おかげさまで

答えて

0

クラスAはインスタンス化されているため、コンテナによってはインスタンス化されていないため、依存関係は注入されません。

これは、MVVMを適切に実装する方法の詳細です。 Caliburn microやPrismのようなフレームワークを参照してください。

0

Aが依存関係を注入するためには、Ninjectによってインスタンス化する必要があります。

IoCを使用する場合は、クラス内でnewでインスタンス化するのではなく、依存関係を渡す必要があります。したがって、コンストラクタでAをインスタンス化するのではなく、Aをコンストラクタ引数としてBに渡すことでこれを修正できます。

public class B 
{ 
    public A MyA; 

    public B(A a) 
    { 
     MyA = a; 
    } 
} 

クラスの設定方法によっては、バインドを作成するか、バインドする必要があります。 AとBのインタフェースを作成し、これらを具体的な型にバインドすることをお勧めします。これは、モックフレームワークでコードをテストする方がずっと簡単です。

注意あなたが投稿バインディング...

Bind<IMasterViewModel>().To<IQMasterViewModel>(); 

は、インターフェイスへのインターフェイスではなく、間違っている具体的なタイプを、結合されるように表示されていること。

関連する問題