6

Ich habe Probleme zu verstehen, wie die neue Funktion von Dependency Injection in Play 2.4 angewendet wird. Ich kenne Guice und vermisse in der Play-Dokumentation eine Erklärung, wie und wann die eigentliche Bindung stattfindet. Ich habe die offizielle Doku [1] gelesen und versucht, den neuesten Play Mailer [2] als Beispiel zu verwenden. Das Play Mailer-Beispiel verwendet eine beliebige Klasse und kennzeichnet die -Eigenschaft mit @inject. Wenn ich versuche, ein Objekt dieser Klasse zu verwenden, ist die Eigenschaft null zumindest während des Debuggens. Also, wo und wann muss ich die Injektion machen? Ich habe das gleiche Problem für die @singleton Annotation. Es wird nur erklärt, wie man es kommentiert, aber nicht, wie man ein Objekt erhält. Muss ich Guice direkt verwenden oder ist es integriert wie?Play 2,4 Dependency Injection verstehen

[1] https://www.playframework.com/documentation/2.4.x/JavaDependencyInjection

[2] https://github.com/playframework/play-mailer

+0

Können Sie uns Ihren Code zeigen? – Salem

+0

Es ist im Grunde wie das offizielle Play Mailer Beispiel. Ich initiiere die 'MyComponent' in einer anderen Klasse und rufe die' sendMail() 'Methode auf. – linsenfips

+0

Ich bin auch davon verwirrt und würde gerne einige weitere Beispiele sehen. Ich schreibe einen S3-Code und ich habe ein S3File-Objekt abhängig von einem S3Service, der injiziert werden soll. Wie erstelle ich eine neue S3File-Instanz mit S3Service? Erstelle ich einen Injektor in meinem Controller? In diesem Fall würde ich "injector.getInstance (S3File.class)" anstelle von "new S3File" verwenden? Wie erstelle ich den Injektor - es scheint wie Overkill zu sein, ein bestimmtes Impl von AbstractModule zu erzeugen, um die Bindung für diese eine Klasse zu machen. Was macht die @ImplementedBy auf meiner Schnittstelle, wenn nicht das? – eljaydub

Antwort

1

Ich glaube, die Bindung geschieht durch MailerModule-play.modules.enabled hinzugefügt. MailerModule bietet die Guice-Bindung für MailerClient.

play { 
    modules { 
    enabled += "play.api.libs.mailer.MailerModule" 
    } 

Für Guice MailerClient in Ihr Objekt zu injizieren, sollte es durch Guice erstellt werden. Wenn Sie beispielsweise @Inject MailerClient in einem Controller oder einem Dienst verwenden möchten, der in den Controller eingespeist wird, muss Ihr Controller über Guice eingespeist werden. Recommended approach for this in Play 2.4 fügt Ihrem build.sbt folgendes hinzu:

routesGenerator := InjectedRoutesGenerator 
+0

Ja, genau. Das dachte ich mir. Es muss durch Guice injiziert werden. Ich verstehe, wie dies mit dem 'InjectedRoutesGenerator' gemacht wird, weil dort eine Instanz vorhanden ist, die die Injektion durchführt. In der Dokumentation des Play Mailers wird dies jedoch nicht in einem Controller, sondern in einer zufälligen Klasse gemacht. Wer ist also verantwortlich? – linsenfips

+0

@linsenfips Wenn das Feld MailerClient injiziert werden soll, muss dieses 'zufällige Klassen' Objekt über Guice erstellt werden. Alternativ können Sie das Feld manuell mit Constructor/Setter festlegen, wenn Sie DI vollständig überspringen möchten. – bravo2

+0

Danke! Das ist was ich dachte. Aber trotzdem: Wie mache ich das? Die Play-Entwickler integrierten Guice fest in das Framework. Was ist also der "offizielle Spielweg", um ein Objekt durch Guice zu erschaffen? – linsenfips