現在、将来のプロジェクトで Ninject を使用できるかどうかを評価しています。1 つの条件は、ライブラリが Dispose メソッドの呼び出しを強制してはならないということです。それで、それは本当に必要ですか?それを呼び出さないと、メモリリークやその他の醜いものが発生しますか?
2 に答える
純粋に管理されたソリューションである Ninject は、Dispose() を呼び出さなければ、メモリ リークやその他の問題が発生するとは思いません。特に、アプリケーションを終了する前に行う最後の処理の 1 つとしてカーネルの Dispose() メソッドを呼び出すだけなので、いずれにせよ GC または OS のプロセス分離によってメモリが回収されます。
Dispose() を呼び出すことができる IoC コンテナーが必要な理由は、IDisposable を実装しているすべてのサービス プロバイダーで Dispose() を呼び出すためです。サービス プロバイダーは、管理されていないリソースを所有している場合や、非同期操作が完了するまで待機する必要がある場合があるため (または、少なくともそれらを適切な方法で中止する必要がある場合)、これは便利な機能だと思います。
これが、カーネル/プロバイダー/ロケーター クラスに IDisposable を実装するほとんどの IoC コンテナーの背後にある理由であると私は確信しています。
IoC コンテナーで Dispose() を使用することが問題になるのはなぜですか? これまでのところ、コンソール アプリケーション、XAML ベースの WPF アプリケーション、Xbox ゲームなど、呼び出すのに適切な場所を常に見つけてきました。
Dispose に役立つように Ninject を構成できます。それは、Ninject で使用するスコープと戦略によって異なります。例えば:
InTransientScope
Ninject は、作成されたオブジェクトが関連付けられているスコープ オブジェクトが GC によって収集されるとすぐに、別のスコープを持つすべての Disposable オブジェクトを破棄します 。、- シングルトンは、カーネルが破棄されるときに破棄されます。
- また、
OnDeactivation
メソッドまたはInScope(x => new DisposableStrategy())
- または
StandardScopeCallbacks.Request
、オブジェクトを で破棄するために使用しますHttpRequest
。これは、Web アプリケーションに役立ちます。