2015-04-07 5 views
23

Ich fragte (und beantwortete) die gleiche Frage für Dolch 1 here. Wie würde ich etwas ähnliches für Dagger 2 tun, jetzt, dass ObjectGraph.inject nicht mehr existiert.Wie spritze ich in ein Servlet mit Dolch 2?

Guten Tag Mitglieder Injektion, wenn das Objekt muss von einem anderen Rahmen geschaffen werden:

Diese Frage könnte verallgemeinert werden? (in diesem Fall ein Servlet-Container).

Antwort

7

Ich habe versucht, die gleiche Frage zu beantworten. I denke, Ich bin nah gekommen, wie es "sollte" ideal arbeiten, aber ich bin nur um das GitHub-Projekt verdummend und versuchen, es basierend auf Informationsfetzen dort herauszufinden, wie viele der Dokumentation für Dolch 2 wird noch geschrieben (ab dieser Woche).

Mein Beispielcode unten ist eigentlich für eine Android-Aktivität, aber ich glaube, dass derselbe Ansatz für das Servlet funktionieren sollte, nach dem Sie fragen.

Fügen Sie einen MembersInjector < ...> zu Ihrer @ Component-Schnittstelle hinzu; beispielsweise in der folgenden Komponente habe ich für meine MainActivity Klasse hinzugefügt:

package ...; 

import javax.inject.Singleton; 
import dagger.Component; 
import dagger.MembersInjector; 

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

Und dann in der Klasse, die Sie wollen nach Objekterstellung an einer geeigneten Stelle Mitglied injiziert, sondern geben, bevor Sie müssen verwenden Sie Ihre injizierten Mitglieder, müssen Sie die Komponente erstellen und das Element Injektion verwenden:

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... 
    } 
} 

Das einzige, was ich nicht klar bin, ob dieses Muster die Komponente innerhalb des Objekts zu schaffen, in injiziert werden angenommen hat, ist richtig. Es fühlt sich nicht ganz richtig an, aber es ist immer noch sehr flexibel, da Sie nur fest an die Komponente und nicht an die Module binden. Vielleicht ist das die richtige Herangehensweise, aber vielleicht ist es ein bisschen daneben.

+2

Ah; Es ist auch möglich, eine void -Methode in Ihrer Component-Schnittstelle zu erstellen, die ein Objekt aufnimmt, und es wird eine Member-Injektion darauf durchführen. Das wäre ein bisschen einfacher als der hier bereitgestellte Quellcode, aber funktionell gleich. Hier ist die relevante Dokumentation: https://google.github.io/dagger/api/2.0/dagger/Component.html –

0

Obwohl ich nicht sehr glücklich damit bin, da ich Code schreiben muss, funktioniert so etwas mit 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(); 
    } 
} 

Sie betrachten können die MyDaggerComponent Instanz in ServletContext setzen und es dann so erhalten in init() Methode:

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