2

免責事項: DI とサービス ロケーター パターンの間には議論があることは承知しています。議論を避けるための質問があります。この質問は、たまたま Fowler のように「DI は... 理解するのが難しい... 全体として、必要な場合以外は避けたい」と考えているサービス ロケータ ファンへの質問です。私の質問の目的のために、私はDIを避ける必要があります(意図的に与えられていない理由)ので、私の質問に関係のない議論を引き起こしようとしているわけではありません.

質問: IOC コンテナーをシングルトンに保持することで発生する可能性のある唯一の問題 (上記の免責事項を思い出してください) は、子コンテナーの使用に関するものです。おそらく、子コンテナ自体はシングルトンではありません。最初は、それが本当の問題を引き起こしていると思いました。しかし、考えてみると、まさにそれが私が望む動作だと思い始めました (子コンテナーはシングルトンではなく、自由に Disposed() にすることができます)。

それから私の考えはさらに哲学的な領域に入りました。私はサービス ロケーターのファンなので、そもそも子コンテナーの概念がどれほど必要なのか疑問に思っています。私が有用性を確認した少数のケースでは、DI を満たすためであったか (とにかくほとんど避けています)、または IOC コンテナーに頼らずに問題を解決できました。私の考えは、「GetChildContainer」メソッドをリストすることさえ気にしないIServiceLocator インターフェイスに部分的に触発されました。

ですから、私の質問は次のとおりです。もしあなたがサービス ロケーターのファンなら、通常、子コンテナーは意味がないことに気づきましたか? それ以外の場合、それらはいつ不可欠になりましたか?

追加のクレジット: シングルトンのサービス ロケーターに他の哲学的な問題がある場合 (DI 支持者によって提起された問題は別として)、それらは何ですか?

4

1 に答える 1

3

私見では:

  • 子コンテナーは、サービス ロケーターとは関係ありません。つまり、直交しています。コンテナーをサービス ロケーターとして使用することは、それを使用する方法であり、コンテナーが子コンテナーをサポートしているかどうかとは関係ありません。
  • 子コンテナーの使用は、コンテナーの設計に大きく依存します。たとえば、Windsor ではサポートされていますが、ほとんど使用されていません。Autofac OTOH は、スコープ/コンポーネントのライフサイクルを管理するためにそれらを頻繁に使用します。また、これはコンテナー/サービス ロケーターの実装の完全にオプションの機能であるため、IServiceLocator はそれについて言及していません。IServiceLocator の仕事は、サービス ロケータの最小公分母を提供することです。
于 2010-04-13T22:51:41.433 に答える