2009-08-25 7 views
6

Welche Vor- und Nachteile hat die Verwendung eines Service Locators gegenüber einem Singleton? Ich habe gelesen, dass Singletons schlecht sind, aber ich frage mich, ob s Service Locator im Allgemeinen ein besserer Weg wäre, Dinge zu tun.Singleton Vs ServiceLocator

Antwort

9

Beide Ansätze sind schlecht, da es aus dem Klassenvertrag nicht offensichtlich ist, was seine Abhängigkeiten sind. Das heißt,

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

hat Verweise auf SomeSingleton und IProvider tief irgendwo im Inneren vergraben. Im Vergleich zum reinen Singleton-Ansatz sind Service-Locators im Allgemeinen jedoch viel besser, da sie eine einfachere zentralisierte Konfiguration, Lebensdauermanagement usw. ermöglichen. Sie ermöglichen auch eine bessere Testbarkeit (Sie können Anrufe immer simulieren (GetService<T>)), niedrigere Kopplung , Trennung von Bedenken usw.

+2

Ich würde so weit gehen, beide Anti-Muster zu berücksichtigen, aber ich stimme zu, dass Service Locator am Rande vorzuziehen ist. Die beste Lösung wäre die Implementierung einer geeigneten Dependency-Injektion. –

+0

von dem, was ich von DI verstehe, würde es nicht erfordern alle Objekte, die verwendet, um den Singleton direkt zugreifen, um einen Verweis auf das Ex-Singleton-Objekt zu haben? – djcouchycouch

+0

Ja, Sie müssen sie als Parameter für den Konstruktor angeben (wenn Sie die Konstruktorinjektion verwenden, wird dies normalerweise als "Deklarieren Sie Ihre Abhängigkeiten" bezeichnet). Um die Dinge ein wenig zu erleichtern, können Sie Inversion of Control-Container verwenden. Sehen Sie sich Google Guice an. –

0

Wenn die Testbarkeit ein Problem ist, ist die Verwendung des Service Locators viel besser als reine Singletons.