39

IoC コンテナーを抽象化する方法としてCommon Service Locatorを検討してきましたが、このタイプのこのタイプに強く反対する人がいることに気付きました。

人々はそれを決して使用しないことを勧めますか? いつも使ってる?または時々それを使用しますか?場合によっては、どのような状況で使用し、どの状況で使用しないか.

4

4 に答える 4

33

サード パーティの開発者が使用するライブラリ コードを作成しているとします。コードは、これらの開発者が提供するサービス オブジェクトを作成できる必要があります。ただし、各呼び出し元がどの IoC コンテナーを使用するかはわかりません。

Common Service Locator を使用すると、特定の IoC をユーザーに強制することなく、上記の問題に対処できます。

ライブラリ自体の中で、独自のクラスを IoC に登録したい場合がありますが、呼び出し元の邪魔にならない独自の使用のために IoC を選択する必要があるため、これは非常に難しくなっています。

于 2009-08-13T09:08:56.820 に答える
19

CSL の使用に反対する議論の 1 つが誤りであることに気付きました。開発者は、このライブラリは Service Locator パターンしか実行できないと考えているからです。ただし、依存性注入パターンでも簡単に使用できるため、そうではありません。

ただし、CSL ライブラリは、ユーザーが依存関係を登録できるようにする必要があるフレームワーク設計者向けに特別に設計されています。ライブラリは CSL を直接呼び出すため、フレームワークの観点からは SL パターンについて話しているため、その名前が付けられています。

ただし、フレームワークの設計者として、CSL への依存を軽視すべきではありません。フレームワークを使いやすくするためには、通常、独自の DI メカニズムを使用する方がはるかに優れています。非常に一般的なメカニズムは、構成ファイルで依存関係を設定することです。このパターンは、.NET フレームワーク全体で使用されます。ほとんどすべての依存関係を別のものに置き換えることができます。.NET プロバイダー パターンは、これに基づいて構築されています。

フレームワークの設計者が CSL に依存すると、ユーザーはアプリケーションを使いにくくなります。ユーザーは、IoC コンテナーを構成し、それを CSL に接続する必要があります。ただし、あらゆる種類の検証がサポートされている .NET 構成システムを使用しているときに実行できるように、フレームワークが構成を検証することはできません。

于 2010-09-07T10:06:52.440 に答える
9

最近、サービス ロケータの概念についていくつか読みました。これはカップリングを減らすのに役立つ方法ですが、ロケーターにコードをカップリングする必要があります。ロケーターをサポートするコンテナーではなく、ロケーター自体です。これはトレードオフですが、適切な状況では有益です。

これが役立つ状況の 1 つは、レガシー コードなど、DI を使用しないコードがある場合です。私は現在、このボートに乗っています。必要なオブジェクトを直接作成するのではなく、SL を介してプルすることで、いくつかの抽象化を追加できます。私はこれを SL と DI/IoC の中間段階と考えています。

于 2009-04-10T04:30:13.273 に答える
0

サービスを必要とするライブラリ コードがあり、このコードをより大きなフレームワーク/ランタイムのコンテキストでホストできる場合、フレームワーク/ランタイムは、初期化できる起動時にカスタム コードを実行できるメカニズムを提供する必要があります。コンテナと依存関係を登録します。CSL が問題になる可能性がある場所の良い例は、MSCRM のコンテキストで使用する場合です。MSCRM フレームワークが特定のイベントで実行するプラグインを登録することで、カスタム ビジネス ロジックを実行できます。遭遇する問題は、DI コンテナーを設定するためにサブスクライブできる「開始」イベントがないため、登録ロジックをどこで実行するかです。何らかの方法で DI をセットアップできたとしても、CSL と DI ライブラリを GAC に配置する必要があります。それが、プラグインからサード パーティ コードを呼び出す唯一の方法だからです (展開チェックリストに追加する項目がもう 1 つあります)。このようなシナリオでは、依存関係をコンストラクター パラメーターとして保持し、呼び出し元のコードが適切と判断したときに初期化できるようにすることをお勧めします (コンストラクター インジェクションまたは手動で適切なインターフェイス実装を「新しく」することにより)。

于 2013-03-26T06:24:02.000 に答える