2

オープンソースの IoC コンテナーの 1 つを掘り下げて、これを 100% 理解する予定ですが、一般のコミュニティにも質問することにしました (密接に関連する質問のいずれにも直接的な回答を見つけることができなかった後)。

典型的な IoC 実装を理解する限り、すべての依存関係を把握したシングルトンとして機能するグローバル クラスのようです。次に、その知識を使用して、コンストラクターまたはプロパティパラメーターを提供します。それらを埋める方法を知っていますか? 多分私は何かが欠けているので、質問です。

IoCがどのように機能するか、および/またはそれがルートでシングルトンであるかどうかを誰かが明確に教えてもらえますか?

アップデート

私の質問は、「魔法の」IoC が Ninject.MVC のようにどのように機能するのかということだと思います。注射はどこで「うまくいく」のですか?

4

5 に答える 5

1

IoCコンテナーはシングルトンではない傾向があります。これは、複数のコンテナーを同時に実行したい場合があるためです(たとえば、システムのレイヤーごとに1つ)。ただし、これは最も一般的な方法ではありません

したがって、コンテナにアクセスするには、実際のコンテナ自体への参照が必要です。

コンテナが真のシングルトンではない場合でも、Service Locatorを使用してコンテナにアクセスできます(http://msdn.microsoft.com/en-us/library/ff921142(v=pandp.20).aspxも参照してください)。 )。

于 2012-11-05T15:28:47.980 に答える
1

すべての主要な DI フレームワーク (または少なくとも Java と .NET 内) は通常、アプリケーションの有効期間中に単一のコンテナー インスタンスを持つようにアドバイスします。一部のコンテナーは「子コンテナー」の概念をサポートしていますが、それらの子コンテナーはその単一のコンテナーから作成され、実際には同じインスタンスの一部にすぎません。

たとえば、レイヤーごとまたはセッションごとのコンテナーなど、複数のコンテナーを持つことは絶対に可能ですが、依存性注入の原則に従ってアプリケーションを設計した場合、通常、アプリケーションごとに 1 つのコンテナーで最良の結果が得られます (. NET では、これはアプリ ドメインごと、または一般的には同じメモリ スペースで実行されるすべてのコードになります)。(デスクトップ) クライアントと Web サービスで構成されるアプリケーションを処理する場合、両方とも独自のコンテナーを持ちます (実際には、これらは別のプログラムであり、他方を認識していないため)。

(Web ユーザー) セッション、リクエスト、または同様のものごとにコンテナー インスタンスを定義することは可能ですが、セッションよりも長い有効期間を持つ依存関係を登録するのは難しく、多くの依存関係があるため、これは非常に複雑になる傾向があります。コンテナを作成する際のパフォーマンスのオーバーヘッド。

于 2012-11-05T17:21:17.710 に答える
0

OK、さらにオンラインでブラウジングして同僚と話した後、静的シングルトンでなければIoCを(少なくともステートフルプログラム..winforms / wpfで)実装する方法はないと思います。そのため、Composition Rootパターンを使用し、サービスロケーターの方法で静的シングルトンとしてninjectカーネルを使用することを計画しています。引き続きkernel.Getを呼び出しますが、少なくともそのアイテム内の依存関係の処理は失われると思います。私はただ輪になって走っていました:)。

このようなもの:

Main
{
  setupkernel();
  Application.Run(kernel.Get<Main>);
}

btn_GetChildForm()
{
    kernel.Get<ChildForm>().Show();
}

誰かがより良い方法を知っているなら、私に知らせてください。そうでなければ、これは私がこれを行うための最良の方法としてつなぎ合わせたものです。

于 2012-11-05T16:43:43.950 に答える
0

シングルトンでなければならない理由はありません。コンテキストによってエンティティをまとめたという理由だけで、複数のコンテキストを実行できます (Spring の用語を使用するためですが、引数を Spring に限定するものではありません)。

Java のようなプラットフォームでは、シングルトンを強制することさえできないことに注意してください (複数のクラスローダー アーキテクチャのため)。

于 2012-11-05T15:32:13.110 に答える
-1

ServiceLocatorはアンチパターンです

「コンポジションルート」の性質を理解してみてください。

于 2012-11-07T12:13:02.443 に答える