2016-04-18 6 views
2

Ich verwende codingwell/scala-guice und versuche, DAO-Klassen in Konstruktoren anderer Komponenten/Klassen zu injizieren.Guice in Scala: Modul für eine Klasse, die einen DI-Konstruktor selbst hat

Im ersten Versuch, habe ich nur eine DAO-Klasse, um zu sehen, ob es funktioniert:

class DaoModule extends AbstractModule with ScalaModule { 
    override def configure() { 
    val dao1 = new FirstDaoImpl 
    bind(new TypeLiteral[FirstDaoTrait] {}).toInstance(dao1) 
    } 
} 

Die Bindung funktioniert wie erwartet, kann es für Konstruktor Injektion verwendet werden.

Im zweiten Schritt wollte ich dem Modul eine weitere DAO-Klasse hinzufügen. Allerdings hängt die DAO-Klasse auf dem ersten DAO:

class SecondDaoImpl @Inject()(firstDao: FirstDaoTrait) extends SecondDaoTrait 

Ich bin nicht sicher, wie die notwendige Bindung an das bestehende Modul hinzuzufügen. in ergäbe dies den ersten Schritt zu wiederholen:

val dao2 = new SecondDaoImpl(???) 
bind(new TypeLiteral[SecondDaoTrait] {}).toInstance(dao2) 

Aber natürlich kann diese Klasse nur durch die Bereitstellung der ersten DAO (also die „???“) instanziiert werden. Wie kann ich das machen?

Antwort

2

Verwenden bind und lassen scala-guice die Abhängigkeiten für Sie lösen:

class DaoModule extends AbstractModule with ScalaModule { 
    override def configure() { 
    bind[FirstDaoTrait].to[FirstDaoImpl] 
    bind[SecondDaoTrait].to[SecondDaoImpl] 
    } 
} 

Und jetzt mit dem Injektor:

val injector = Guice.createInjector(new DaoModule()) 
val secondDao = injector.instance[SecondDaoTrait] 
+0

Danke, das funktioniert. Also ist die Verwendung des Injektors eine Alternative zur Verwendung der Konstruktoreinspritzung? Weil ich die Konstruktorinjektion nicht geändert habe und es scheint immer noch zu funktionieren. – fxlae

+1

@JFo Es ist nur eine Möglichkeit, die Abhängigkeiten aufzulösen und war am einfachsten zu demonstrieren :) –

Verwandte Themen