2009-08-25 9 views
6

シングルトンに対するサービスロケータの使用のメリットとデメリットは何ですか?私はシングルトンが悪いと読んだことがありますが、サービスロケータが一般的には良いことをやっているのだろうかと思っています。シングルトン対ServiceLocator

答えて

9

どちらのアプローチも、クラスコントラクトからその依存関係が明らかではないという点で悪いです。それは

private void foo() 
{ 
    var x = SomeSingleton.Instance.GetX(); 
    var y = ServiceLocator.GetService<IProvider>().GetY(); 
} 

SomeSingletonと深いどこかの内部に埋め込まIProviderへの参照を持っている、です。

しかし、純粋なシングルトンアプローチと比較して、サービスロケータは、より簡単な中央設定、ライフタイム管理などを可能にする点で、一般的にはるかに優れています。懸念の分離など。

+2

私は両方のアンチパターンについて検討するつもりですが、サービスロケータがわずかに好ましいと私は同意します。最適な解決策は、適切な依存性注入を実装することです。 –

+0

私はDIから理解しているものから、シングルトンに直接アクセスしていたオブジェクトすべてに、シングルトンオブジェクトへの参照を直接持たせる必要はありませんか? – djcouchycouch

+0

はい、コンストラクタへのパラメータとして与える必要があります(コンストラクタインジェクションを使用する場合、これは通常「依存関係を宣言する」と呼ばれます)。少し簡単にするために、Inversion of Controlコンテナを使用することができます。 Google Guiceを見てみましょう。 –

0

テストの可能性が懸念される場合、サービスロケータを使用すると純粋なシングルトンがはるかによくなります。

関連する問題