2017-02-28 2 views
0

Es gibt 2 Bereiche in meiner Anwendung, die sind 1) Singleton lebt mit dem Antragsprozess und 2) UserScope beginnt sofort nach der Benutzeranmeldung und endet unmittelbar vor dem Benutzer abmelden.Wie kann Dolch2 Objekte der gleichen Klasse mit unterschiedlichen Bereichen injizieren?

Wenn der Benutzer nicht angemeldet ist in, gibt es eine allgemeine OkHttpClient (von OkHttp3) für die Verwendung, die keine Authentifizierung hat, während während des UserScope alle Netzwerk über einen authentifizierten OkHttpClient gehen muss.

Es gibt zwei Lösungen meiner Meinung nach kommen durch weder ich denke, Best Practice ist:

1): eine Singleton OkHttpClient mit einem TokenInterceptor Verwendung, die eine setToken Methode hat es überall verwenden und verschiedene Token-Werte gesetzt. Das ist momentan was ich benutze. Das Hauptproblem besteht darin, dass die Methode setToken und der Getter synchronisiert werden müssen, um die Thread-Sicherheit zu gewährleisten.

2): Mit @Named Injektion. Das ist schlimmer. Angenommen, wir nennen zwei Typen von OkHttpClient, unauthorized und authorized, das Problem ist, dass das Objekt authorized nicht immer da ist, da der Benutzer möglicherweise nicht eingeloggt ist. Was ist die beste Vorgehensweise, um mit diesem Anwendungsfall zu arbeiten?

Hintergrund: In meinem Projekt gibt es Dagger2, Retrofit2 und OkHttp3. Und der Server sendet verschiedene Sätze von Daten, wenn autorisiert und nicht autorisiert.

+0

Die Art, wie ich es sehe, gibt es kein Problem mit der Option 1. Sie haben eine Abhängigkeit - die '' OkHttpClient'' und ihre Interzeptoren ändern Verhalten abhängig von der Benutzersitzung. Ein synchronisierter Setter und Getter ist kein Problem. Der Mangel an Synchronisation war ein Problem, das vor langer Zeit gelöst wurde und heutzutage nicht als solches gesehen werden sollte. Synchronisation ist eigentlich eine Lösung und eine ziemlich gute :) – Fred

Antwort

1

Ich benutze UserScope für OkHttpClient-Instanz, so habe ich einzelne OkHttpClient, während Benutzer angemeldet ist. Dieser OkHttpClient wird einmal nach Benutzeranmeldung instanziiert, und ich setze Token genau einmal. Wenn der Benutzer nicht angemeldet ist, verwende ich einen anderen OkHttpClient mit dem Bereich, der mit meinem LoginActivity Lebenszyklus zusammenhängt.

Verwandte Themen