tutorial support para inyección for español dummies dependencias con java servlets dagger dagger-2

java - para - dagger android support



¿Cómo se inyecta en un servlet con Dagger 2? (2)

Le pregunté (y contesté) la misma pregunta para Dagger 1 here . ¿Cómo haría algo similar para Dagger 2, ahora que ObjectGraph.inject ya no existe?

Esta pregunta podría generalizarse a:

¿Cómo se inyecta a los miembros si el objeto debe ser creado por un marco diferente? (en este caso, un contenedor Servlet).


Aunque no estoy muy contento con esto ya que tengo que escribir un código repetitivo, algo así funciona con servlet.

public class MyServlet extends HttpServlet { @Inject MyService service; @Override public void init( ServletConfig config ) throws ServletException { super.init(config); this.service = MyDaggerComponent.create().injectMyService(); } }

Puede considerar configurar la instancia de MyDaggerComponent en ServletContext y luego obtenerlo así en el método init ():

((MyDaggerComponent)config.getServletContext().getAttribute("MyDaggerComponent")).injectMyService()


He estado tratando de responder esta misma pregunta. Creo que me he acercado a la forma en que "debería" funcionar a la perfección, pero solo estoy trabajando en el proyecto GitHub y tratando de resolverlo en base a fragmentos de información allí, ya que gran parte de la documentación para Dagger 2 sigue siendo escrito (a partir de esta semana).

Mi código de ejemplo a continuación es en realidad para una actividad de Android, pero creo que este mismo enfoque debería funcionar para el servlet sobre el que está preguntando.

Agregue un MemberInjector <...> a su interfaz @Component; por ejemplo, en el siguiente componente, he agregado uno para mi clase MainActivity:

package ...; import javax.inject.Singleton; import dagger.Component; import dagger.MembersInjector; @Singleton @Component(modules = { PlaygroundModule.class }) public interface MainComponent { Wizard createWizard(); MembersInjector<MainActivity> mainActivityInjector(); }

Y luego, en su clase, quiere que se le inyecte un miembro, en un lugar apropiado después de la creación del objeto, pero antes de que necesite usar sus miembros inyectados, necesita crear el componente y usar la inyección del miembro:

package ...; // other imports import javax.inject.Inject; import dagger.MembersInjector; public class MainActivity extends ActionBarActivity { @Inject Wizard wizard; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainComponent c = DaggerMainComponent.create(); c.mainActivityInjector().injectMembers(this); // other code... } }

Lo único que no tengo claro es si este patrón de creación del componente dentro del objeto que se supone debe inyectarse es correcto. No se siente del todo bien, pero sigue siendo muy flexible, ya que solo se vincula estrechamente al componente y no a los módulos. Entonces quizás este sea el enfoque correcto, pero quizás esté un poco apagado.