6

Mam problemy, aby zrozumieć, jak zastosować nową funkcję Dependency Injection w Play 2.4. Znam Guice i tęsknię w Dokumentacji Play, wyjaśnienie, jak i kiedy ma miejsce faktyczne wiązanie. Przeczytałem oficjalny dokument [1] i próbowałem użyć najnowszego Play Mailera [2] jako przykładu. Przykład Play Mailer wykorzystuje dowolną klasę i zawiera adnotację o wartości MailerClient z @inject. Kiedy próbuję użyć obiektu tej klasy, właściwość jest null, przynajmniej podczas debugowania. Gdzie i kiedy muszę zrobić właściwy zastrzyk? Mam taki sam problem z adnotacją @singleton. Wyjaśniono tylko, jak ją opatrzyć, ale nie w jaki sposób uzyskać obiekt. Czy muszę używać Guice bezpośrednio, czy jest to zintegrowane?Understanding Play 2.4 Dependency Injection

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

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

+0

Czy możesz pokazać nam swój kod? – Salem

+0

Jest to zasadniczo jak oficjalny przykład Play Mailer. Inicjuję 'MyComponent' w innej klasie i wywołuje metodę' sendMail() '. – linsenfips

+0

Jestem również zdezorientowany i chciałbym zobaczyć więcej przykładów. Piszę trochę kodu S3 i mam obiekt S3File zależny od S3Service, który powinien zostać wstrzyknięty. Jak utworzyć nową instancję S3File z wtryskiwaną S3Service? Czy mogę utworzyć wtryskiwacz w moim kontrolerze? W takim przypadku myślę, że użyłbym "injector.getInstance (S3File.class)" zamiast "nowy S3File"? Jak utworzyć wtryskiwacz - wydaje się, że overkill musi utworzyć konkretną impozycję modułu AbstractModule, aby wykonać wiązanie dla tej jednej klasy. Co robi funkcja @ImplementedBy w moim interfejsie, jeśli nie to? – eljaydub

Odpowiedz

1

wierzę, wiązanie się dzieje dzięki MailerModule dodano do play.modules.enabled. MailerModule zapewnia powiązanie Guice dla MailerClient.

Aby Guice wprowadził MailerClient do obiektu, należy go utworzyć za pomocą Guice. Na przykład, jeśli chcesz użyć @Inject MailerClient w kontrolerze lub usłudze wprowadzonej do kontrolera, twój kontroler musi zostać wprowadzony przez Guice. Recommended approach for this in Play 2.4 dodaje do twojego build.sbt:

routesGenerator := InjectedRoutesGenerator 
+0

Tak, dokładnie. To jest to co myślałam. To musi być wstrzyknięte przez Guice. Rozumiem, jak to zrobić z 'InjectedRoutesGenerator', ponieważ tam masz jakieś Instance, który robi zastrzyk. Ale w dokumentacji Play Mailera nie jest to robione w kontrolerze, ale w klasie losowej. Kto zatem jest odpowiedzialny? – linsenfips

+0

@linsenfips Jeśli pole MailerClient ma zostać wstrzyknięte, to ten obiekt "klasy losowej" musi zostać utworzony za pomocą Guice. Alternatywnie, możesz ręcznie ustawić pole, używając Constructor/Setter, jeśli chcesz całkowicie pominąć DI. – bravo2

+0

Dzięki! Tak myślałem. Ale wciąż: Jak to zrobić. Programiści Play zintegrowali Guice z ramami. Więc jaki jest "oficjalny sposób gry" tworzenia obiektu przez Guice? – linsenfips

Powiązane problemy