2017-10-15 1 views
1

Ich habe einen Anwendungsfall, die die Notwendigkeit, um anzuzeigen, scheint so etwas wie scope.removeModules(...) in der Toothpick DI Bibliothek haben.Gibt es eine Möglichkeit, ein Modul zu einem Scope in einer Toothpick DI-Bibliothek hinzuzufügen?

In einer Android-Anwendung habe ich ein Modul, das eine Bindung an die Klasse erstellt, die mit einem Server über eine Retrofit-Bibliothek-Schnittstelle kommuniziert. Die eigentliche Server-URL wird zum Zeitpunkt dieser Klasse Schöpfung festgelegt und wird deshalb als Modul Konstruktor Parameter geliefert:

class NetworkModule(serverUrl: String) { 
    init { 
    bind(MyServerApi::class.java).toInstance(createMyApi(serverUrl)); 
    } 
} 

Jetzt ist das Problem, dass dieses Modul eine App weit eine und muss zu einer Anwendung hinzugefügt werden Geltungsbereich (Root-Bereich), ABER serverUrl kann später vom Benutzer neu konfiguriert werden. Das bedeutet, dass MyServerApi muss neu erstellt werden. Und es scheint, als wäre es großartig, wenn man das ganze Modul einfach entfernen und wieder zum Wurzelbereich hinzufügen könnte, sobald die URL geändert wurde.

Auf diese Weise ganz App wird noch in der Lage seine Toothpick.openScope(getApplication()) zu tun und Zugriff auf die neueste konfigurierte Instanz der MyServerApi auf die richtigen serverUrl sprechen zu bekommen.

Ich frage mich, ob ich einige Design-Wahl von dieser Bibliothek, die das obige möglich machen würde ohne die Methode in die Bibliothek zu vermissen vermissen?

Antwort

0

Es gibt keine Möglichkeit, ein Modul in TP zu entfernen. so würde den Rahmen in einem fremden Zustand versetzt zu tun, da einige Abhängigkeiten von den Bindungen des Moduls noch erhalten würden, während die ursprünglichen Bindungen in dem Modul nicht mehr vorhanden wären. Ehrlich gesagt, ist es wirklich schwer, eine klare Semantik zu geben, was das bedeuten würde.

ABER, die gute Sache ist, dass Sie eine komplette Beseitigung Ihrer Bindungen mit TP erzielen können: Erklären Sie einfach einen speziellen Spielraum für sie und schließen Sie diesen Bereich. Es wird alles richtig und sauber zu entfernen, werden alle Dinge, die als Ihre Bindungen im gleichen Umfang instanziiert oder recycelt sollten werden auch ausgelöscht werden, während die Integrität der Bereiche darüber zu versichern.

Fügen Sie einfach einen intermediären Bereich direkt unterhalb des Anwendungsbereichs hinzu und stellen Sie sicher, dass alle Bereiche ihn als übergeordnetes Element verwenden, wenn sie geöffnet werden.

+1

Diese Technik ein Fluss Rahmen genannt wird, können Sie ein Beispiel finden: https://github.com/stephanenicolas/toothpick/blob/d39ff12d0b8a1acd7f00c87b29e9a37fbdda9da0/smoothie-sample/src/main/java/com/example/smoothie/RxMVPActivity .java: Diese Aktivität definiert einen Bereich, der die Rotation überlebt. Sehen Sie sich das praktische Annotationssystem an, um es zu erreichen. – Snicolas

+0

Danke, ich habe es so gemacht. Unter "toothpick-di" auch noch eine Frage gepostet, würde mich freuen wenn du es dir anschaust wenn du Zeit hast. In Bezug auf die In-Modul-Abhängigkeitsauflösung. Von Dagger kommend bin ich ein bisschen verloren – dimsuz

Verwandte Themen