Ist ServiceLocator ein anti-pattern?

Kürzlich habe ich gelesen Mark Seemann Artikel über den Service Locator anti-pattern.

Autor weist hauptsächlich zwei Gründe, warum ServiceLocator ist ein anti-Muster:

  1. API-Nutzung-Problem (was ich völlig in Ordnung)
    Wenn die Klasse beschäftigt ein Service locator ist es sehr schwer zu erkennen, Ihre Abhängigkeiten, wie in den meisten Fällen-Klasse hat nur einen PARAMETERLOSEN Konstruktor.
    Im Gegensatz ServiceLocator, DI-Ansatz explizit aussetzen Abhängigkeiten per Konstruktor-Parameter also, die Abhängigkeiten sind einfach gesehen, in IntelliSense.
  2. Wartung Problem (das verwirrt mich)
    Betrachten Sie das folgende zB

Wir haben eine Klasse 'MyType', die mit einem Service-locator-Ansatz:

public class MyType
{
    public void MyMethod()
    {
        var dep1 = Locator.Resolve<IDep1>();
        dep1.DoSomething();
    }
}

Nun wollen wir hinzufügen, eine andere Abhängigkeit zu der Klasse 'MyType'

public class MyType
{
    public void MyMethod()
    {
        var dep1 = Locator.Resolve<IDep1>();
        dep1.DoSomething();

        //new dependency
        var dep2 = Locator.Resolve<IDep2>();
        dep2.DoSomething();
    }
}

Und hier ist, wo mein Unverständnis beginnt. Der Autor sagt:

Wird es viel schwieriger zu sagen, ob Sie die Einführung einer brechen ändern oder nicht. Sie müssen verstehen, dass die gesamte Anwendung, in denen der Service-Locator verwendet wird, und der compiler ist nicht zu helfen.

Aber warten Sie eine Sekunde, wenn wir mit DI-Ansatz, würden wir die Einführung einer Abhängigkeit mit einem anderen parameter im Konstruktor (bei der constructor injection). Und das problem wird noch da sein. Wenn wir vielleicht vergessen, um das setup ServiceLocator, dann können wir vergessen, fügen Sie eine neue Zuordnung in unserer IoC-container und DI-Ansatz würde die gleiche Laufzeit-problem.

Außerdem Autor erwähnt über unit-test Schwierigkeiten. Aber, nicht wir haben Probleme mit der DI-Ansatz? Nicht wir müssen aktualisieren Sie alle tests wurden Instanziierung dieser Klasse? Wir werden aktualisiert und vermitteln ein neues verspottet Abhängigkeit nur um unseren test kompilierbar. Und ich sehe keine Vorteile von diesem update und Zeit verbringen.

Ich versuche nicht zu verteidigen Service-Locator-Ansatz. Aber dieses Missverständnis machen mich denken, dass ich etwas zu verlieren sehr wichtig. Könnte jemand zerstreuen meine Zweifel?

UPDATE (ZUSAMMENFASSUNG):

Die Antwort auf meine Frage "Ist das Service-Locator-ein anti-pattern" hängt nun wirklich von den Umständen ab. Und ich definitiv nicht empfehlen kann, ist zu überqueren, es aus der Werkzeug-Liste. Es könnte sehr nützlich sein, wenn Sie beginnen, den Umgang mit legacy-code. Wenn Sie Glück genug, um am Anfang Ihr Projekt dann bei der DI-Ansatz wäre die bessere Wahl, da es einige Vorteile gegenüber den Service-Locator.

Und hier sind die wichtigsten Unterschiede, die mich überzeugt, nicht die Nutzung des Service Locator für meine neuen Projekte:

  • Die meisten offensichtlich und wichtig: Service Locator blendet Klasse Abhängigkeiten
  • Wenn Sie Verwendung einigen IoC-container, wird es wahrscheinlich Scannen Sie alle Konstruktor beim Start überprüft alle Abhängigkeiten und geben Ihnen sofortiges feedback auf fehlende mappings (oder falsche Konfiguration); dies ist nicht möglich, wenn Sie Ihre IoC-container als Service Locator

Für details Lesen Sie hervorragende Antworten, die sind unten angegeben.

"Nicht wir müssen aktualisieren Sie alle tests wurden Instanziierung dieser Klasse?" Nicht unbedingt wahr, wenn Sie mit einem generator in Ihren tests. In diesem Fall würden Sie nur das update-generator.
Du hast Recht, es hängt davon ab. In großen Android-apps, zum Beispiel, so weit die Menschen waren sehr zurückhaltend mit DI wegen der Leistung Bedenken, die auf low-spec-mobile-Geräte. In solchen Fällen müssen Sie eine Möglichkeit finden, noch schreiben von testbarem code, und ich würde sagen, Service Locator ist ein gut-genug Ersatz in diesem Fall. (Hinweis: die Dinge können sich ändern für Android, wenn die neuen Dolch 2.0 DI-framework ist ausgereift genug.)
Beachten Sie, dass, da diese Frage schon gepostet hat, gibt es ein update auf Mark Seemann Service Locator ist ein Anti-Pattern-post - beschreibt, wie service-locator gegen OOP durch Aufbrechen der Kapselung, das ist seine beste argument noch (und der eigentliche Grund für all die Symptome, die er verwendet, werden alle vorherigen Argumente). Update 2015-10-26: Das grundlegende problem mit dem Service Locator ist, dass es gegen Kapselung.

InformationsquelleAutor davidoff | 2014-04-01

Schreibe einen Kommentar