2

これは私のシナリオです:

次のようなアプリケーションがあります。

Ninject を DI コンテナーとして使用し、WPF を使用しています

ここに画像の説明を入力

1-そこにClassB注入されるClassA注入1stViewModelされる 注入される1stView

2- 再び そこにClassR注入される注入されるClassQ注入2ndViewModelされる 注入される2ndView

3-そして、これは3番目と4番目のウィンドウで起こります

質問:

1- コンポジション ルートにないクラスが必要な場合 (ユーザーが 1 番目のボタンまたは 2 番目のボタンをクリックしたとき) にクラスを解決するにはどうすればよいですか?

2-ビューに注入せずViewModels、ビュー内に新しいインスタンスを作成したい場合ViewModel、明らかに、たとえばIClassA1番目とIClassQ2番目のパラメーターが必要です。どうすればいいですか?

4

2 に答える 2

2

ninject.extensions.factory を使用して、定義した特定のインターフェイスのバインディングを定義したり、コンストラクターにToFactorya を注入したりできます。Lazy<T>詳細については、拡張機能の wiki を参照してください https://github.com/ninject/ninject.extensions.factory/wiki

于 2013-07-14T12:39:50.483 に答える
2

この質問の複製に対する回答でした)

+1 ダニエルの答え - 100% 正しいです。説明と例を 1 つだけ。

適切な場合 (ジャストインタイムの作成と単一の依存関係インスタンスのキャッシュLazyが必要な場合)が最良の選択です。バインディングは必要ありません。拡張機能が必要なだけです。

Lazy<IFoo>と sを作成する Factoryの明らかな違いは、FactoryIFooの目的は新しいインスタンスを作成することですが、常に同じインスタンスを持つことです。

を使用する代わりに、単にファクトリに Foo を作成させたい場合はFunc<IFoo>、次のように正確に使用できます。

interface IFooFactory
{
   IFoo CreateFoo();
}

Bind<IFoo>().To<Foo>();
Bind<IFooFactory>().ToFactory();

.ToFactory()ビットは舞台裏ですべての実装を行います (つまり、インターセプターとキャッスル ダイナミック プロキシを作成し、以下を実現する本体を使用します。

class _SomethingAnonymous : IFooFactory
{
    readonly IResolutionRoot _resolutionRoot; 

    public _SomethingAnonymous(IResolutionRoot resolutionRoot)
    {
        _resolutionRoot=resolutionRoot; 
    }

    IFoo CreateFoo() 
    { 
         _resolutionRoot.Get<IFoo>();
    }
 }

そしてそれにBinds IFooFactory

このコードを具体的なものにしないということは、(コードを開発するときに必要な場合) パラメータなしで基本的な作成を超えるさまざまな方法を提供することを意味します。

于 2013-07-23T14:51:49.710 に答える