2016-03-31 11 views
1

Hoffentlich wissen Sie, was ich mit der Frage meine, wenn ich den Kontext dessen erkläre, was ich tun möchte: Ich versuche, Dolg mit der Gluon Ignite-Bibliothek in meinem JavaFX-Projekt zu verwenden.Wie Sie Instanzen anfordern, die von Dagger verwaltet werden, indem Sie nur die Annotation @Inject in allen Klassen verwenden?

Mein Setup ist ein bisschen seltsam:
Ich habe ein EJB-Projekt mit mehreren Klassen, die zwischen Clients geteilt werden sollten. Es enthält zwei mit @Stateless und @Singleton annotierte Klassen und kann daher als EJBs auf einem Anwendungsserver bereitgestellt werden. Ich möchte die Klassen des EJB-Moduls aus einer eigenständigen JavaFX-Anwendung verwenden. Daher sollte der JavaFX-Client ohne die auf einem Anwendungsserver bereitgestellten EJBs funktionieren.

Deshalb habe ich Grandle gesagt, die EJBs-Klassen in der JavaFX-Anwendung zu packen. Das EJB-Modul ist auch Teil eines EAR-Projekts, das über einen Grapple-Multiprojekt-Build erstellt wird, um es bereitzustellen. Der Build von JavaFX ist unabhängig vom EAR-Modul und der Multiprojektkonfiguration. Jetzt möchte ich Dagger (Gluon Ignite) verwenden, um die Dienste vom EJB-Modul zu injizieren. Wenn möglich, möchte ich die EJB-Klassen nicht mit einem dolchspezifischen Code "polulieren", um ihn dennoch als Standard-EJB-Modul bereitstellen zu können. Außerdem sollten die EJBs Instanzen voneinander anfordern können. Ich kann nicht glauben, dass es nicht funktioniert, da Dagger auf den JSR-330-Standardannotationen basiert.

Ich habe Injektion bekam nur aus meiner Application-Klasse arbeitet von

private final DIContext context = new DaggerContext(this,() -> Arrays.asList(new DaggerApplicationModule())); 
@Inject 
GlobalService globalService; 

Hinzufügen Ich schrieb ein Dolch-Modul, das nur die Anbieter für eine Klasse enthält, die über eine Schnittstelle eingespritzt werden soll. Für die anderen Klassen habe ich @Inject zu ihrem Konstruktor ohne Argumente hinzugefügt. Soweit ich weiß, verursacht der Methodenaufruf context.init(); (gehört zu Gluon Ignite) in der Startmethode der Anwendungsklasse die Feldinjektion. Im Gegensatz zu, dass ich herausgefunden, dass ein Weg, um die Abhängigkeiten in anderen Klassen zu lösen, als meine Anwendungsklasse durch manuelles Schreiben so etwas wie diese:

ObjectGraph og = ObjectGraph.create(new DaggerApplicationModule()); 
globalService = og.get(GlobalService.class); 

Ansonsten durch die Felder mit @Inject mit Anmerkungen versehen, bleiben sie null . Für mich sieht das wie ein nerviger Standardcode aus, den ich in meinen EJB-Klassen gerne hätte. Muss ich wirklich etwas ähnliches manuell schreiben? Vielleicht bekomme ich das ganze Konzept falsch.

Antwort

0

Dolch erfordert weiterhin, dass Sie die Klassen in der Module Annotation auflisten. Hier ist die Moduldefinition aus dem Ignite Dagger-Beispiel. Beachten Sie das "injects" -Attribut:

@Module(library = true, injects = {DaggerApp.class,ViewController.class}, complete = false) 
class DaggerModule { 

    @Provides 
    public Service provideService() { 
     return new Service(); 
    } 

} 
+0

Nun, sicher habe ich einige Versuche und Fehler mit dem injects-Attribut. In meiner Konfiguration ist die einzige vom Compiler benötigte Klasse die Anwendungsklasse. Zu meinem Verständnis wäre es sinnvoll, Dagger auch von der ViewController-Klasse zu erzählen, da es ein Einstiegspunkt des ObjectGraph ist und nicht von Dagger selbst erstellt wird, aber das macht leider keinen Unterschied. – MannikJ