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?
scala
dependency-injection
Fabian
quelle
quelle
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 .
quelle
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.
quelle
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
quelle
Ein aktuelles Projekt zeigt einen DI, der ausschließlich auf der Konstruktorinjektion basiert: zalando / grafter
quelle
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.
quelle
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.
https://youtu.be/ecekSCX3B4Q?t=1154
quelle
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.
quelle
Ich habe hier gezeigt, wie ich mit 2.10 einen sehr einfachen funktionalen DI-Container in Scala erstellt habe.
quelle
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.
quelle