2016-08-02 20 views
2

Ich habe ein ApplicationComponent, die den Zugriff auf meine Repositories bietet: LocationRepository, PlaylistRepository, ...Dagger 2 Multi-Prozess-Abhängigkeiten

Diese Repositories sind alle @Singleton. So weit so gut.

Mein Problem ist, dass ich auf einen dieser Repositories (LocationRepository) von einem Service in einem anderen Prozess zugreifen muss.

Ich könnte einfach new LocationRepository(params) in diesem Service (und ich brauche eine andere Instanz, da der Service-Lebenszyklus ist unabhängig von der App), aber das ist nicht sehr sicher.
Wenn ich ändere, wie der Dienst im Dolch erstellt wird, könnte ich vergessen, den Dienst auch zu aktualisieren.

Gibt es eine Möglichkeit, einen Teil einer Komponente (hier der LocationService) separat zu deklarieren und in zwei verschiedenen Komponenten auf dieselbe Weise zu instanziieren?

Antwort

0

ComponentA.java

@Component(modules = ModuleA.class) 
public interface ComponentA { 

} 

ComponentB.java

@Component(modules = ModuleB.class) 
public interface ComponentB { 

} 

ModuleA.java

@Module 
public class ModuleA { 
    @Provides 
    @Named("LocationA") 
    LocationService locationService() { 
     return new LocationService(<your_params>); 
    } 
} 

ModuleB.java

Und in Ihrer Tätigkeit/Service

@Inject @Named("LocationA") LocationService locationService; 

oder

@Inject @Named("LocationB") LocationService locationService; 
+0

Dies ermöglicht es mir, die Komponente zweimal mit verschiedenen @ Named zu deklarieren, aber es garantiert nicht, dass die Objekte der LocationRepositories-Konstruktoren identisch sind – Teovald

+0

Sie können ein Modul erstellen, um die Parameter für die LocationRepos und bereitzustellen Lassen Sie die 2 Komponenten dieses Modul verwenden. Sie müssten den gleichen Umfang haben. – mbmc

1

Wenn ich richtig verstehe, wollen Sie sicherstellen, dass die Definition (und Instanziierung Logik) Ihre LocationRepository über zwei Prozesse identisch ist .

Wenn dies der Fall ist, könnten Sie es immer in ein eigenes Bibliotheksmodul ziehen, und beide Prozesse nehmen dieses Modul als Abhängigkeit. Sie könnten sogar eine @Component Schnittstelle dort auch setzen.

Ich würde es nicht empfehlen.

Sie würden mit zwei Instanzen desselben Singleton enden. Dies ist unvermeidbar, da Prozesse voneinander isoliert sind und sich kein Gedächtnis teilen. Jeder hat seine eigene VM. Dies würde zu schwer zu debuggenden Datenrennen führen, da beide Prozesse von einer einzelnen Ressource lesen und auf diese schreiben.

Es macht mehr Sinn für mich, dass ein Prozess es "besitzen" würde, und der andere Prozess würde darauf zugreifen über Inter-Prozess-Kommunikation, z. über eine AIDL-Schnittstelle, wie die Google Play Services-Clients.

Ich stelle mir vor, dass ein Prozess einen langlebigen Dienst hostet und der andere hostet Ihre UI. In diesem Fall ist Ihr Dienst ein natürlicher Eigentümer des Singletons und Ihr UI-Prozess verwendet eine Implementierung des Repositorys, das mit dem Dienst kommuniziert. Dies könnte sogar an der Injektion teilnehmen; Machen Sie ein Modul, das @Provide ist ein LocationRepository, und geben Sie ihm eine gebundene Dienstverbindung.

Dies ist alles wirklich High-Level; Ich hoffe es macht Sinn und ist hilfreich. Glücklich, mehr Details zur Verfügung zu stellen, wenn ich kann!

+0

Ich möchte hauptsächlich wissen, wie ich diese gemeinsame Definition in zwei verschiedenen Injektionen ausdrücken kann :-). Sie haben jedoch Recht, die 2 Instanzen wären unabhängig mit möglichen Datenrennen. In meinem speziellen Anwendungsfall ist es nicht wirklich ein Problem (ich habe eine Benutzeroberfläche, die lesen/schreiben und einen IntentService mit nur Lesezugriff). Es wäre jedoch sinnvoll, den Repo insgesamt in einen separaten Prozess zu verschieben. – Teovald