3

Um Code zu entkoppeln, können Sie Service-Locater haben, aber dies ist nicht dasselbe wie globale Variablen/Status ?.Sind Service-Locators nicht nur globale Variablen/Status?

Ich kenne diese oft ablaufenden Schnittstellen, also übergibt man eine Schnittstelle und bekommt eine konkrete Klasse zurück aber trotzdem steht meine Frage.

Zum Beispiel:

class Something { 

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

Hier ist die Klasse erfordert MyType, die woanders erzeugt wird, sondern als Übergang MyType nach unten durch die Ketten (über Bauer etc ...) ist es auf diese Weise erworben wird.

Diese Frage habe ich schon früh in meiner beruflichen Laufbahn als Entwickler gestellt - vorher war mir dieses Muster nicht aufgefallen. Anthony hat meine Meinung (und deshalb ist die ausgewählte Antwort jetzt) ​​auf Service Locator - in der Tat sehe ich sie als Anti-Muster wie andere. Die bereitgestellten Links sind ein guter Ausgangspunkt - aber um nach all dieser Zeit meine eigene Frage etwas zu beantworten, agieren sie als globaler Zustand und sollten vermieden werden. Bevorzugen Sie die Standardabhängigkeitsinjektion;)

+0

Ein Beispiel oder zwei könnte die Diskussion ein wenig Feuer und Flamme bekommen. –

Antwort

2

Ja, das sind globale Variablen. Anspruchsvolle, aber sie haben immer noch die gleichen grundlegenden Nachteile. Aus diesem Grund ist die Abhängigkeitsinjektion bevorzugt.

Für detailliertere Diskussion der Alternative der Konstruktor Injektion, siehe auch die Frage What’s the difference between the Dependency Injection and Service Locator patterns?

und andere Web-Seiten Singletons are Pathological Liars und Dependency Injection pattern

+0

Die Frage ist nicht, ob Service Locator das "beste" Muster ist, oder ob es besser ist als die Abhängigkeitsinjektion. Die Frage ist, ob es sich um globale Variablen handelt (was nicht der Fall ist, -1), und wenn nicht, ob es besser ist. – erickson

+0

Wenn "ServiceLocator" keine globale Variable ist, was ist das dann? Können Sie Links zu einer ausführlicheren Diskussion bereitstellen? Jemand, der dieses Muster in Betracht zieht, sollte sich der bevorzugten Alternativen bewusst sein, daher die Links, die das detaillierter diskutieren. – Anthony

3

Der Namensdienst, der normalerweise das Service Locator-Muster sichert, verwendet tatsächlich einen Namensraum, der global ist.

Allerdings muss man die Gründe betrachten, warum "globale Variablen" als schlecht angesehen werden. Viele davon drehen sich um die Möglichkeit, eine globale Variable an einer beliebigen Stelle im Programm zu ändern. Die meisten Benennungsdienste können jedoch Änderungen an einem gebundenen Objekt einschränken. Das Objekt selbst kann unveränderlich sein.

Service Locator ist nicht einfach eine globale Variable, es ist eine Spezialisierung. Und diese Spezialisierung mindert häufig viele der Probleme, die sich aus globalen Variablen ergeben können.

+2

das Hauptproblem mit Service-Locator ist, dass es Abhängigkeiten verbirgt (http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/). Service Locator tut nichts, um dieses Problem zu mildern. Und es ist schwierig, einen Testdienst zu testen, es sei denn, Sie machen es wieder veränderbar, in diesem Fall sind die Modifikationsprobleme zurück. – Anthony

+0

Sicher, aber darum geht es bei dieser Frage nicht. Der Kontrast besteht hier zwischen globalen Variablen und Namensdiensten, nicht Namensdiensten gegenüber der Welt. – erickson

1

Irgendwann brauchen Sie eine konkrete Implementierung, um etwas Arbeit zu erledigen. Der Dienst ist "global" in einem Sinne, dass er für Ihre Anwendung "verfügbar" ist. Sie müssen es jedoch nicht zu einer globalen Variablen in Ihrem Code machen.

Sie können das Argument umkehren. Wenn Sie in Ihrer Anwendung auf einen Dienst zugreifen müssen, mit welchem ​​Muster würden Sie darauf zugreifen und ohne ihn an eine konkrete Implementierung zu binden. Es gibt nicht viele Alternativen.

Einige Ressourcen sind an sich „global“ zu Ihrer Anwendung, nehmen Sie das Betriebssystem, das Dateisystem, das Windowing-System, ...

Die Diskussion mehr philosophisches als ein Problem eine Lösung ist. Wie auch immer, hoffe es hilft.