2016-08-02 9 views
2

У меня есть ApplicationComponent, который обеспечивает доступ к моим репозиториев: LocationRepository, PlaylistRepository, ...Dagger 2 многопроцессном зависимости

Эти хранилища все @Singleton. Пока все хорошо.

Проблема заключается в том, что мне нужно получить доступ к одному из этих репозиториев (LocationRepository) из Сервиса в другом процессе.

Я мог бы просто сделать new LocationRepository(params) в этой службе (и мне нужен еще один экземпляр, поскольку жизненный цикл службы не зависит от одного приложения), но это не очень безопасно.
Если я изменил способ создания службы в кинжале, я мог бы забыть обновить службу.

Итак, есть способ, чтобы часть компонента (здесь LocationService) была объявлена ​​отдельно и создавалась таким же образом в двух разных компонентах?

ответ

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

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

А в вашей деятельности/услуг

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

или

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

Это позволяет мне объявить компонент дважды с помощью разных @Named, но это не гарантирует, что объекты, вложенные в конструкторы LocationRepositories, совпадают. – Teovald

+0

Вы можете создать модуль для предоставления параметров, необходимых для LocationRepos, и 2 компонента используют этот модуль. У них должен быть одинаковый охват. – mbmc

1

Если я правильно понимаю, вы хотите, чтобы убедиться, что определение (и конкретизации логика) вашего LocationRepository одинакова в двух процессах ,

Если это так, вы всегда можете подключить его к своему модулю библиотеки и использовать оба процесса для этого модуля в качестве зависимости. Вы даже могли бы установить интерфейс @Component.

Я бы не рекомендовал его.

В результате вы получите два экземпляра одного и того же синглтона. Это неизбежно, потому что процессы изолированы друг от друга и не обмениваются памятью. Каждый из них имеет свою собственную виртуальную машину. Это приведет к трудно-отладочным гонкам данных, так как оба процесса считывают и записывают в один ресурс.

Для меня имеет смысл, что один процесс будет «владеть» им, а другой процесс получит доступ к нему посредством межпроцессного взаимодействия, например. через интерфейс AIDL, например, клиенты Google Play Services.

Я предполагаю, что один процесс содержит долговременную службу, а другой - ваш пользовательский интерфейс. В этом случае ваша Служба является естественным владельцем singleton, и ваш пользовательский интерфейс будет использовать реализацию репозитория, который связывается с сервисом. Это может даже участвовать в инъекции; создайте модуль, который будет расположен в LocationRepository, и передайте ему связанное служебное соединение.

Все это действительно высокоуровневое; Надеюсь, это имеет смысл и полезно. Рад предоставить более подробную информацию, если можно!

+0

Я в основном хочу знать, как выразить это общее определение в двух разных инъекциях :-). Вы правы, хотя 2 экземпляра были бы независимы с возможными гонками данных. В моем конкретном случае использования это не проблема (у меня есть пользовательский интерфейс, который читает/записывает, а IntentService имеет только доступ для чтения). Было бы целесообразно перемещать репо на отдельный процесс вообще. – Teovald

Смежные вопросы