Frage

Was ist der Vorteil der Verwendung von @configurable im Vergleich zu auf Bohne, die nicht von Bohne zu tun di verwaltet von applicationcontext.getbean ? jede jemand Liste Vor-und Nachteile?

War es hilfreich?

Lösung

Ich werde bekommen -20 für diese. Auch der berüchtigte Martin Fowler, die diese schrecklichen Namen ‚Dependency Injection‘ erfunden hätte nicht gedacht, es ist besser für die Prüfung:

http://martinfowler.com/articles/injection.html

  

Ein gemeinsamer Grund, warum Menschen geben für die Bevorzugung Injektion Abhängigkeit ist, dass es einfacher macht zu testen. Der Punkt ist hier, dass die Prüfung zu tun, müssen Sie einfach echten Service-Implementierungen mit Stubs oder Mocks ersetzen. Allerdings gibt es wirklich keinen Unterschied zwischen Dependency Injection und Service Locator: beide sind sehr zugänglich Anstoßen. Ich vermute, dass diese Beobachtung von Projekten kommt, wo die Menschen nicht die Mühe machen, um sicherzustellen, dass ihr Service-Locator kann leicht ausgewechselt werden. Dies ist, wo ständige Prüfung hilft, wenn Sie für die Prüfung nicht leicht Stub-Dienste können, dann ist dies ein ernstes Problem mit Ihrem Design impliziert.

Hier sind meine Einwände:

  1. DI schaltet Implementierung Abhängigkeit in Schnittstelle Abhängigkeiten. Ihre Klasse ist mit Setter verunreinigt, die nicht da sonst sein sollen. Ja der eigentliche Checkout-Prozess hängt von Kreditkartendienst, Postdienst, Datenbankdienst und wer weiß, was morgen, aber wir sollen nicht werben diese Abhängigkeiten. Sie sind Ad-hoc-On-Demand, nicht Schnittstelle wert. im nächsten Monat die gesamte Kaufvorgang reduziert sich auf nur ein REST Aufruf Vielleicht.

  2. Performance. Dienstleistungen sind in der Regel nicht außerhalb eines Verfahrens benötigt. DI erfordert für jeden Dienst eine Feldvariable zumindest, und es wird so lange verwiesen als das Host-Objekt am Leben ist. Wenn ein Dienst pro-Client-Staaten hat, ist dies sehr schlecht. Ich bin keine Performance empfindlich Kerl, aber das fühlt sich einfach falsch.

  3. Codierung für Produktionsumgebung härter. Denken Sie, wie viel mehr Kesselblech Code, den Sie hinzugefügt DI zu verwenden, jedes Mal wenn Sie benötigen einen Service. Alles im Namen der Herstellung einfacher zu testen. Zunächst einmal - was ?! Die Produktion ist die erste Priorität; Tests sollten für sie arbeiten und mit ihm, nicht umgekehrt. Testing ist keine Religion, Leute! Fokus auf Produktionsumgebung, Sorge um später zu testen. Zweitens - testet wirklich einfacher jetzt

  4. Bei der Prüfung müssen Sie nur ein paar Dienste verspotten, die schwer sind und beinhalten out-of-VM-Aktivitäten. Mit Service-Locator, haben Sie eine Testkonfiguration diese Mock Services enthält, und Sie sind fertig. Ihre Checkout-Prozess kann ohne Aufwand getestet werden, sowie alle Klassen, die auf diese Dienste abhängen. In DI, müssen Sie manuell diese Abhängigkeiten verwalten, in jeder Unit-Test. -Aber! Aber mit DI haben Sie die Flexibilität von nun verschiedene Mock-Mail-Dienste für verschiedene Testeinheiten bereitstellt! Oh gut für Sie!

  5. "DI fördert eine einheitliche Art und Weise der Dienstkonfiguration" - nur, wenn Sie verwenden den gleichen Rahmen. Eigentlich hat es nichts mit DI zu tun; ein Rahmen eine Möglichkeit der Konfiguration erzwingt, können Sie auch argumentieren, dass Frühling eine einheitliche Art und Weise des Serviceortungs fördert. Wenn sich zu einem Rahmen weit verbreitet ist, kann es sich um eine De-facto-Standard geworden deshalb verschiedene Entwickler miteinander leichter reden machen -. Nur, weil der Netzwerk-Effekt, nicht für alles von Natur aus gut in seinem Design Wahl

Im Ergebnis ist es schlecht für Design, schlecht für die Leistung, schlecht für die Produktion, schlecht für die Prüfung und irrelevant für Maßstäbe. Wozu ist es gut? Es ist wie eine Menge dumme Regeln und Konventionen etabliert längst von fragwürdiger Herkunft, aber wir haben noch folgen ihnen blind jeden Tag. Das ist, was die Gesellschaft macht umgehen.

Bearbeiten : Vorwärts-Link auf eine neue Frage zu DI und Testen Does mit Anmerkungen einzuspritzen degigkeiten entfernen Sie den Hauptvorteil der Dependency Injection (externe Konfiguration)?

Andere Tipps

Doing applicationContext.getBean() besiegt vollständig den Zweck der Dependency Injection , weil Sie länger sind keine Abhängigkeiten zu injizieren. Ein Anwendungskontext XML-Datei ist in Ordnung. Annotation-basierte Konfiguration (Auto-Verkabelung) ist auch in Ordnung. Auf diese Weise kann auch können tun:

Service service = new Service();

oder noch schlimmer:

Service service = ServiceLocator.locate("service");

Sowohl von denen Ihren Code schwer zu testen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top