Ich bin noch am Anfang darin, neben Java auch Scala zu lernen, und ich habe es nicht verstanden, wie soll man dort DI machen? Kann oder sollte ich eine vorhandene DI-Bibliothek verwenden, sollte dies manuell erfolgen oder gibt es einen anderen Weg?
Ich bin noch am Anfang darin, neben Java auch Scala zu lernen, und ich habe es nicht verstanden, wie soll man dort DI machen? Kann oder sollte ich eine vorhandene DI-Bibliothek verwenden, sollte dies manuell erfolgen oder gibt es einen anderen Weg?
Antworten:
Standard-Java-DI-Frameworks funktionieren normalerweise mit Scala. Sie können jedoch auch Sprachkonstrukte verwenden, um den gleichen Effekt ohne externe Abhängigkeiten zu erzielen .
Eine neue Abhängigkeitsinjektionsbibliothek speziell für Scala ist Dick Walls SubCut .
Während der Artikel von Jonas Bonér, auf den in der Antwort von Dan Story verwiesen wird, gebundene Instanzen zur Kompilierungszeit und statische Injection (über Mix-Ins) hervorhebt, basiert SubCut auf der Laufzeitinitialisierung unveränderlicher Module und der dynamischen Injection durch Abfragen der gebundenen Module nach Typ, String-Namen, oder scala.Symbolnamen.
Weitere Informationen zum Vergleich mit dem Kuchenmuster finden Sie im GettingStarted- Dokument.
Die Abhängigkeitsinjektion selbst kann ohne Unterstützung von Tools, Frameworks oder Containern durchgeführt werden. Sie müssen nur new
s aus Ihrem Code entfernen und in Konstruktoren verschieben. Der einzige mühsame Teil, der übrig bleibt, ist die Verkabelung der Objekte am "Ende der Welt", wo Container viel helfen.
Mit den 2.10-Makros von Scala können Sie den Verdrahtungscode zur Kompilierungszeit generieren und verfügen über eine automatische Verdrahtung und Typensicherheit.
Siehe die Abhängigkeitsinjektion im Scala-Handbuch
Ein aktuelles Projekt zeigt einen DI, der ausschließlich auf der Konstruktorinjektion basiert: zalando / grafter
Was ist wieder falsch an der Konstruktorinjektion?
Es gibt viele Bibliotheken oder Ansätze für die Abhängigkeitsinjektion in Scala. Grafter kehrt zu den Grundlagen der Abhängigkeitsinjektion zurück, indem er nur die Konstruktorinjektion verwendet : keine Reflexion, keine XML, keine Anmerkungen, keine Vererbung oder Selbsttypen.
Dann fügt Grafter der Konstruktorinjektion nur die notwendige Unterstützung hinzu, um:
- Instanziieren einer komponentenbasierten Anwendung aus einer Konfiguration
- Feinabstimmung der Verkabelung (Singletons erstellen)
- Testen Sie die Anwendung, indem Sie Komponenten austauschen
- Anwendung starten / stoppen
Grafter zielt auf jede mögliche Anwendung ab, da es sich darauf konzentriert, nur drei Ideen zu verknüpfen:
- Fallklassen und Schnittstellen für Komponenten
- Reader-Instanzen und formlos für die Konfiguration
- Baumumschreibung und Kiama für alles andere!
Ich habe es selbst nicht getan, aber die meisten DI-Frameworks arbeiten auf Bytecode-Ebene (AFAIK), sodass es möglich sein sollte, sie mit jeder JVM-Sprache zu verwenden.
In früheren Beiträgen wurden die Techniken behandelt. Ich wollte einen Link zu Martin Oderskys Vortrag vom Mai 2014 über die Ziele der Scala-Sprache hinzufügen. Er identifiziert Sprachen, die einen DI-Container "benötigen", um Abhängigkeiten einzufügen, als schlecht implementiert. Ich stimme dem persönlich zu, aber es ist nur eine Meinung. Es scheint darauf hinzudeuten, dass das Einfügen einer DI-Abhängigkeit in Ihr Scala-Projekt nicht idiomatisch ist, aber auch dies ist eine Meinung. Selbst mit einer Sprache, die darauf ausgelegt ist, Abhängigkeiten nativ einzufügen, wird durch die Verwendung eines Containers praktisch eine gewisse Konsistenz erzielt. Es lohnt sich, beide Gesichtspunkte für Ihre Zwecke zu berücksichtigen.
Ich würde Ihnen vorschlagen, Distage zu versuchen (Haftungsausschluss: Ich bin der Autor).
Es ermöglicht Ihnen viel mehr als ein typischer DI und hat viele einzigartige Eigenschaften :
scala-reflect
(unterstützt jedoch alle erforderlichen Funktionen des Scala-Typensystems, z. B. höherwertige Typen).Sie können sich auch unseren Vortrag auf der Functional Scala 2019 ansehen , in dem wir einige wichtige Möglichkeiten der Distage besprochen und demonstriert haben.
Zusätzlich zur Antwort von Dan Story habe ich über eine DI-Variante gebloggt , die ebenfalls nur Sprachkonstrukte verwendet, aber in Jonas 'Beitrag nicht erwähnt wird: Value Injection on Traits (jetzt Link zu web.archive.org). Dieses Muster funktioniert sehr gut für mich.