2015-04-01 7 views
8

Durante lo sviluppo di un'applicazione Android sono incappato in un problema. Ho appena iniziato a usare Dagger, quindi conosco alcuni concetti di base, ma quando lo utilizzo al di fuori degli scopi delle esercitazioni e dei loro casi d'uso le cose diventano meno chiare.Daga con Android: come inserire il contesto quando si utilizza MVP?

Quindi, per arrivare al punto. Nella mia applicazione sto usando MVP come descritto in questo post del blog: http://antonioleiva.com/mvp-android/

Quindi all'inizio stavo iniettando la classe Interactor (quella che gestisce i dati) alla classe Presenter e tutto andava bene. Ma poi ho implementato metodi che utilizzano il database SQLite, quindi ora c'era bisogno di usare Context nella mia classe Interactor.

Non riesco a capire come dovrei farlo correttamente? La mia soluzione temporanea era escludere Dagger dalla mia applicazione e passare la variabile di contesto nel costruttore quando si creava la classe Presenter e poi la classe Interactor nel presenter, ma mi piacerebbe usare Dagger.

Quindi la mia applicazione corrente sembra un po 'come questa.

MyActivity implements MyView {  
     MyPresenter p = new MyPresenter(this, getApplicationContext()); 
} 

Constructor all'interno MyPresenter

MyPresenter(MyView view, Context context) { 
     this.view = view; 
     MyInteractor i = new MyInteractor(context); 
} 

E nel costruttore in MyInteractor assegno Context ad una variabile privata.

Avrei solo bisogno di iniettare MyInteractor a MyPresenter, perché questa è la parte di applicazione che dovrà essere testata contro diverse implementazioni. Ma se fosse possibile inserire dei MyPresenter-MyActivity, che sarebbe grande :)

Spero che qualcuno ha una certa esperienza con quello che sto cercando di realizzare :)

risposta

5

Nella classe MyInteractor:

public class MyInteractor { 

    @Inject 
    public MyInteractor(Context context) { 
     // Do your stuff... 
    } 
} 

MyPresenter classe

public class MyPresenter { 
    @Inject 
    MyInteractor interactor; 

    public MyPresenter(MyView view) { 
     // Perform your injection. Depends on your dagger implementation, e.g. 
     OBJECTGRAPH.inject(this) 
    } 
} 

per l'iniezione di un contesto è necessario scrivere un modulo con un metodo prevede:

@Module (injects = {MyPresenter.class}) 
public class RootModule { 
    private Context context; 

    public RootModule(BaseApplication application) { 
     this.context = application.getApplicationContext(); 
    } 

    @Provides 
    @Singleton 
    Context provideContext() { 
     return context; 
    } 
} 

Iniettando il tuo Presenter-classe per la vostra attività non è così facile, perché nel costruttore si dispone di questo MyView parametri, che non poteva essere impostato dal pugnale. Puoi riconsiderare il tuo design fornendo un metodo setMyView nella tua classe MyPresenter invece di utilizzare un parametro costruttore.

Edit: Creazione RootModule

public class BaseApplication extends Application { 
    // Store Objectgraph as member attribute or use a Wrapper-class or... 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     OBJECTGRAPH = ObjectGraph.create(getInjectionModule()); 
    } 

    protected Object getInjectionModule() { 
     return new RootModule(this); 
    } 
} 
+0

Come è possibile che i tuoi 'RootModule' può ottenere il' BaseApplication'? – theblang

+0

@mattblang: ho aggiunto questa parte alla mia risposta. – Christopher

Problemi correlati