5

コードを分離するために、サービス ロケーターを使用できますが、これはグローバル変数/状態と同じではありませんか?

これらはしばしばインターフェイスから実行されることを知っているので、インターフェイスを渡して具体的なクラスを取得しますが、それでも私の質問は残っています。

例えば:

class Something {

    void DoSomething() {
        IMyType myType = ServiceLocator.GetSerivceTypeOf(IMyType);
    }
}

ここで、クラスは別の場所で作成された MyType を必要としますが、MyType をチェーンを介して (コンストラクターなどを介して) 渡すのではなく、この方法で取得します。

私は開発者としてのプロとしてのキャリアの早い段階でこの質問をしましたが、それ以前はこのパターンに出くわすことはありませんでした。Anthony は、サービス ロケーターに関する私の意見を明確にしました (したがって、現在はこれが選択された回答です)。提供されたリンクは良い出発点ですが、これまで何度も自分の質問に答えるには、それらはグローバルな状態として機能するため、避ける必要があります。標準の依存性注入を好む;)

4

3 に答える 3

3

はい、それらはグローバル変数です。洗練されたものですが、それでも同じ基本的な欠点があります。そのため、依存性注入が望ましいです。

コンストラクター注入の代替方法の詳細については、「依存性注入パターンとサービスロケーターパターンの違いは何ですか?」という質問も参照してください。

および他のWebページシングルトンは病理学的嘘つき依存性注入パターンです

于 2010-02-12T09:31:56.887 に答える
3

通常、サービス ロケータ パターンをバックアップするネーム サービスは、実際にグローバルなネーム スペースを使用します。

ただし、「グローバル変数」が悪いと見なされる理由を考慮する必要があります。これらの多くは、プログラム内の任意の場所でグローバル変数を変更する機能を中心に展開しています。ただし、ほとんどのネーム サービスは、バインドされたオブジェクトへの変更を制限できます。オブジェクト自体は不変の場合があります。

Service locator は単なるグローバル変数ではなく、特殊化されたものです。そして、その特殊化により、グローバル変数から発生する可能性のある多くの問題が軽減される傾向があります。

于 2009-06-10T21:50:07.960 に答える
1

ある時点で、何らかの作業を行うために具体的な実装が必要になります。このサービスは、アプリケーションで「利用できる」という意味で「グローバル」です。ただし、コード内でグローバル変数にする必要はありません。

引数を逆にすることができます。アプリケーションでサービスにアクセスする必要がある場合、具体的な実装にバインドせずに、どのパターンを使用してアクセスしますか。多くの選択肢はありません。

一部のリソースは、アプリケーションに対して本質的に「グローバル」であり、オペレーティング システム、ファイル システム、ウィンドウ システムなどを使用します。

議論は問題解決よりも哲学的なものです。とにかく、それが役立つことを願っています。

于 2009-06-10T21:52:32.463 に答える