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
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
@fersesr Sie können verschiedene Komponenten für verschiedene Aktivitäten haben. Einige hängen dann vom Benutzer ab, andere von der Anwendungskomponente –
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