Ich habe eine große Codebasis mit vielen "Anti-Pattern" -Singletons, Dienstprogrammklassen mit statischen Methoden und Klassen, die ihre eigenen Abhängigkeiten mithilfe von new
Schlüsselwörtern erstellen . Es macht es sehr schwierig, einen Code zu testen.
Ich möchte Code schrittweise in den Abhängigkeitsinjektionscontainer migrieren (in meinem Fall Guice
, weil es sich um ein GWT
Projekt handelt). Nach meinem Verständnis der Abhängigkeitsinjektion ist alles oder nichts. Entweder werden alle Klassen von Spring / Guice verwaltet oder keine. Da die Codebasis groß ist, kann ich den Code nicht über Nacht transformieren. Ich brauche also einen Weg, dies schrittweise zu tun.
Das Problem ist, dass ich, wenn ich mit einer Klasse beginne, die in andere Klassen eingefügt werden muss, @Inject
in diesen Klassen keine einfache verwenden kann, da diese Klassen noch nicht vom Container verwaltet werden. Dies schafft also eine lange Kette bis zu den "Top" -Klassen, die nirgendwo injiziert werden.
Die einzige Möglichkeit, die ich sehe, besteht darin, einen Injector
/ application-Kontext vorerst global über einen Singleton verfügbar zu machen , damit andere Klassen verwaltete Beans daraus erhalten können. Dies widerspricht jedoch der wichtigen Idee, das composition root
der Anwendung nicht preiszugeben .
Ein anderer Ansatz wäre Bottom-up: Beginnen Sie mit "High-Level" -Klassen, fügen Sie sie in den Abhängigkeitsinjektionscontainer ein und wechseln Sie langsam zu "kleineren" Klassen. Aber dann muss ich lange warten, da ich diese kleineren Klassen testen kann, die immer noch von Globals / Statics abhängen.
Was wäre der Weg, um eine solche schrittweise Migration zu erreichen?
PS Die Frage Allmähliche Ansätze zur Abhängigkeitsinjektion ist im Titel ähnlich, beantwortet aber meine Frage nicht.