2016-07-30 7 views
1

Ich bin relativ neu in Dagger2, aber ich habe die Vorteile der Verwendung in meinen Projekten geliebt. Ich versuche derzeit benutzerdefinierte Bereiche zu verstehen.DI mit Dolch 2, ersetze die Subkomponente auf der gebauten Komponente

Ich habe diese grundlegende App-Setup: ApplicationComponent, ActivityComponent, UserComponent. Und das ist, wie ich sie beabsichtigen, in meiner app zu arbeiten

    [-----------User scope-------------] 
[ Activity scope ][ Activity scope ][ Activity scope ][ Activity scope ] 
[-----------------------Aplication Scope (Singleton)-------------------] 

In den beiden Aktivitäten in der Mitte ist der Benutzer angemeldet

Mein Abhängigkeitsgraphen sieht wie folgt aus:. AplicationComponent <-ActivityComponent <-UserComponent

UserComponent hängt in ActivityComponent zu arbeiten, und ActivityComponent ist abhängig von AplicationComponent.

UserComponent ist nur eine "Specialized" ActivityComponent, die auch den aktuellen angemeldeten Benutzer bietet. Aktivitäten, die den Benutzer nicht benötigen, werden nur mit ActivityComponent injiziert, diejenigen, die den injizierten Benutzer benötigen, müssen UserComponent verwenden. Ich hoffe es macht Sinn.

Wenn der Benutzer erste anmeldet, erstelle ich ein UserComponent in der aktuellen Aktivität:

ActivtyComponent activityComponent = DaggerActivityComponent.builder() 
     .activityModule(new ActivityModule(this)) //** here, 'this' is the current Activity 
     .applicationComponent(MyApplication.getApp(getActivity()).getAppComponent()) 
     .build(); 

UserComponent userComponent = DaggerUserComponent.builder() 
     .activityComponent(activityComponent) 
     .build(); 

userComponent.inject(this); 

//Store user component to be retrieved by other activities 
MyApplication.getApp(getActivity()).storeUserComponent(userComponent); 

Dies funktioniert gut. Nun, sagen Sie, dass ich eine neue Aktivität starte und versuche, ihre Abhängigkeiten zu injizieren. Diese Zeit ist viel einfacher, ich habe bereits eine UserComponent aus diesem Grund gespeichert! Ich kann das nur verwenden, richtig ?:

MyApplication.getApp(getActivity()).getUserComponent().inject(this); 

Falsch! ... Es wird abstürzen! weil diese Komponente immer noch die vorherige Aktivität in ihrem Aktivitätsmodul gespeichert hat (** siehe Code oben)

Und ich möchte keine andere UserComponent erstellen, die den Bereich nutzlos machen würde ... alle Methoden werden aufgerufen wieder, habe ich recht?

Ich brauche diese spezifische Komponente, nicht eine neue. Aber ich muss seine ActivityComponent irgendwie gegen eine neue austauschen, die neue wird diese Aktivität in ihrem activityModule übergeben ... das ist meine Frage:

Ist es möglich? Betrachte ich das richtig? Kann ich Unterkomponenten in bereits gebauten Komponenten ändern?

Vielen Dank im Voraus

Antwort

1

Normalerweise sind die Art und Weise die meisten Tutorials zeigen es ist, dass Sie sich wie AppComponent <- UserComponent <- ActivityComponent Ihre Abhängigkeiten einmal

Komponenten zu erstellen scoped Objekte und wenn sich etwas ändert, sollten Sie eine neue Komponente erstellen. Es gibt keine Hot-Swapping-Module oder Objekte in Dolch 2 und wenn Sie versuchen, dies durch zu denken, sehen Sie warum:
Wenn Sie die Abhängigkeit A angeben, verwenden Sie A überall, ersetzen Sie dann A durch NEW-A und verwenden Sie NEW-A Punkt auf ... Das ist ein wirklich inkonsistenten Zustand, den Sie vielleicht vermeiden möchten.

Eine Komponente sollte in ihrem jeweiligen Lebenszyklus leben.Wenn Ihre Komponente einen Verweis auf die Aktivität enthält, sollte sie nur mit dieser Aktivität verwendet werden, da dies zu einem Speicherverlust (oder zu Fehlern wie dem Ihren) führt.

Wenn Ihre Benutzerkomponente von der Anwendung abhängt, können Sie diese Komponente in der Anwendung speichern, ohne Probleme zu verursachen. Ihre Aktivitäten erstellen dann einfach ihre eigenen, definierten Komponenten — mit und abhängig von der Anwendungs- oder Benutzerkomponente.

+0

Ich habe festgestellt, dass die meisten Tutorials die Abhängigkeit Reihenfolge verwenden, die Sie erwähnen. Ich habe es ausprobiert und es funktioniert! Ich mag es einfach nicht, weil es nur zwingt, bei jeder Erstellung einer ActivityComponent eine UserComponent bereitzustellen. Und das ist für jede Aktivität, selbst für "ausgeloggte" Aktivitäten, bei denen kein Benutzer injizieren muss, macht dies wenig Sinn. Ich habe bemerkt, dass die von Ihnen genannte Abhängigkeitsreihenfolge dieser Regel folgt, bei der die kürzerlebigen Bereiche von längeren abhängen, also muss etwas daran liegen. Danke für die unkomplizierte Erklärung. Es ist jetzt klar, warum die Hotswapping-Komponente nicht praktisch ist. – feresr

+0

@fersesr Sie können verschiedene Komponenten für verschiedene Aktivitäten haben. Einige hängen dann vom Benutzer ab, andere von der Anwendungskomponente –

+0

Yup, ich habe Leute gesehen, die das gemacht haben. Es ist ein gültiger Ansatz. Persönlich mag ich es, meine Komponenten etwas generischer/abstrakter zu halten, ich möchte nicht mit vielen Komponenten enden Wenn die App in Zukunft mehr Aktivitäten erfordert. Ich werde mit der ersten Annäherung gehen :) – feresr