0

これは、winforms の DI に関する私の誤解に過ぎないと感じています。

Ninjectを既存の winforms アプリに実装しようとしています。Program.cs では、次のようなことをしています

IKernel kernel = new StandardKernel(new NinjectBindings());
Application.Run(kernel.Get<MainContainer>());

私のNinjectBindingsは持っています

Bind<IFilterEngine>().To<FilterEngine>();

次に、MainContainerフォームのフォームの顧客ユーザーコントロール(SearchResults.cs)で、メソッドインジェクションを使用しようとしています

[Inject]
public void AddFilterEngine(IFilterEngine filterEngine)
{
   _filterEngine = filterEngine;
}

アプリは正常にコンパイルおよび実行されますが、私の _filterEngine インスタンスは null であり、AddFilterEngine メソッドは呼び出されません。これは Ninject で SearchResults が作成されていないためでしょうか? 親フォームにハードコーディングされています。もしそうなら、この時点からすべての親もNinjectで作成する必要があると思いますか?

4

2 に答える 2

1

インジェクションは、インスタンスが Ninject を介して作成された場合、つまり を呼び出した場合にのみ発生しますKernel.Get<T>()。これは通常、アプリケーション内の「最上位」ポイントでのみ行われるか、このインスタンス自体を作成する Ninject によってのみ行われます。

Kernel.Get<SearchResult>()そのため、自己バインディングを使用して (クラスが呼び出されたと仮定して)呼び出してユーザーコントロールを作成するSearchResultか、コンテナーを (たとえば、コンストラクター引数として) 作成しない限り、残念ながらメソッドが呼び出されることはありません。

于 2013-06-04T15:11:23.117 に答える
0

オブジェクトの作成時に値を注入するには、Ninject のフィールドまたはプロパティ セッターを使用する必要があります。

[Inject]  
public IFilterEngine FilterEngine { get; set; }

このプロパティをパブリックにする必要がない場合は、パラメーターとしてコンストラクターに渡すこともできます。これが推奨される方法です。Ninject Web サイトの例に従ってください。

于 2013-08-20T01:00:51.223 に答える