Ich habe ein vorhandenes System überarbeitet, um die Abhängigkeitsinjektion zu verwenden, und diese Arbeit verlief reibungslos.
Nach einer Weile bemerkte ich, dass eine große Anzahl von internen Bibliotheken von dem von mir verwendeten DI-Framework abhängig wurde. Infolgedessen hängt das gesamte Projekt jetzt von diesem Drittanbieter-Framework ab.
Ich sah eine Ironie darin, alle Abhängigkeiten zu entkoppeln, indem ich sie von einer gemeinsamen Bibliothek abhängig machte.
Meine erste Reaktion bestand darin, eine Wrapperbibliothek um das Abhängigkeitsframework zu erstellen. Daher könnte ich dieses Framework bei Bedarf ersetzen. Nachdem ich die damit verbundene Arbeit eingeschätzt hatte, stellte ich fest, dass die resultierende API dem vorhandenen Framework ähneln und es daher schwieriger machen würde, es zu ersetzen. Also habe ich die Idee aufgegeben.
Ich mache mir Sorgen, dass das DI-Framework, das ich verwende, veraltet ist oder ersetzt werden muss.
Gibt es bei der Arbeit mit DI ein Entwicklungsmuster, das die Kopplung zwischen einem Projekt und dem DI-Framework verringert?
quelle
DIFramework.Get<IService>()
ist eigentlich keine Abhängigkeitsinjektion. Es handelt sich um ein ähnliches Muster namens Service Locator. Viele Leute mögen Service Locator nicht, weil es Sie mit dem Framework verbindet und zu leicht missbraucht wird (wie Singleton). Martin Fowler hat einen tollen Artikel über diese Muster: martinfowler.com/articles/injection.htmlAntworten:
Sie haben völlig Recht - wenn Sie ein DI-Framework verwenden, hängt Ihr Code höchstwahrscheinlich von diesem Ding ab. Eigentlich ist das zu überraschend, da dies normalerweise für jede andere Framework- oder Foundation-Bibliothek zutrifft, insbesondere wenn diese Bibliothek Ihr Projekt mit einigen generischen Funktionen unterstützt, die überall in Ihrem Code verwendet werden. Wenn Sie sich beispielsweise für die Verwendung eines bestimmten UI-Frameworks oder Web-Frameworks entscheiden, kann diese Entscheidung nachträglich nur schwer geändert werden, sobald Sie eine bestimmte Codemenge basierend auf dieser Bibliothek erstellt haben. Wenn Sie sich für eine bestimmte (möglicherweise nicht standardmäßige)
String
Klasse entscheiden, können Sie diese Entscheidung später nicht einfach ändern. Eine solche Entscheidung ist eine architektonische Entscheidung. Sie entspricht der Auswahl einer bestimmten Programmiersprache und versucht, diese Entscheidung zu ändern, nachdem Sie mehr als 100 KB Code geschrieben haben.Es ist möglicherweise kein Problem, wenn Ihr gesamter Code von einem bestimmten Framework abhängt, solange er Ihren Erwartungen entspricht und ordnungsgemäß gewartet wird. Aber es kann zu einem Problem werden, wenn dies nicht der Fall ist. Es gibt einige Strategien, um mit dieser Situation umzugehen:
Wählen Sie ein Framework eines Anbieters, von dem Sie überzeugt sind, dass er Ihnen in einigen Jahren Updates und neue Releases bereitstellen kann
Wählen Sie ein Open-Source-Framework mit nur wenigen Codezeilen (und einer geeigneten Lizenz), damit Sie alle Wartungsarbeiten selbst durchführen können, wenn der Anbieter vom Markt verschwindet
Schreiben Sie Ihr eigenes Framework
Lebe mit der Situation, solange der Anbieter verfügbar ist. Wenn er wirklich verschwindet, wähle ein anderes Framework und versuche, einen Adapter zu erstellen, der das alte Framework mit dem neuen emuliert
Die Idee, eine Wrapper-Bibliothek im Voraus zu erstellen, ist überhaupt nicht neu, aber ich habe selten gesehen, dass dies funktioniert, da Sie Annahmen für eine zukünftige Situation treffen müssten, für die Sie nicht wissen, ob oder wann es Sie treffen wird und was Das "neue" Framework wird so aussehen. Andererseits haben wir vor einigen Jahren ein vollständiges UI-Framework in einem C ++ - Projekt mit ~ 120 KB Codezeilen erfolgreich ausgetauscht, indem wir die oben erwähnte Adapterstrategie angewendet haben.
quelle
Für die normale Konstruktorinjektion ist kein Framework erforderlich. Das einzige, was Sie verlieren, ist die Möglichkeit, Ihre Abhängigkeiten in einer Konfigurationsdatei zu zentralisieren.
DI-Container sind ein "Unternehmenssoftware" -Muster, das verwendet wird, wenn das Objektdiagramm sehr groß und komplex ist. Ich vermute, dass 95% der Bewerbungen dies nicht erfordern.
quelle
Ich glaube nicht, dass DI-Frameworks bald wirklich überholt sein können. Was sollte passieren, um es überholt zu machen?
Ich würde sagen, dass der aktuelle DI ausgereift genug ist und mir nicht bewusst ist, dass dort viel passiert. Sie haben Ihre Sprache nicht angegeben. Wenn Sie also von Guice sprechen , ist dies ziemlich unauffällig und funktioniert mit Standard-Java-Annotationen (verwendet auch ihre eigene Sprache für Dinge, die nicht standardisiert sind, die Sie aber selten benötigen). Es ist Open Source, weit verbreitet und Apache-lizenziert. Woran könnte das liegen?
Ich bin mir ziemlich sicher, dass das Ändern des DI-Frameworks um Größenordnungen einfacher wäre als das Ändern einer anderen Bibliothek (z. B. bedeutet eine Änderung der Benutzeroberfläche viel mehr Arbeit).
quelle