Dagger 2多进程依赖项

时间:2016-08-02 14:44:23

标签: android dagger-2

我有一个ApplicationComponent,可以访问我的存储库: LocationRepository,PlaylistRepository,...

这些存储库都是@Singleton。 到现在为止还挺好。

我的问题是我需要在另一个进程中从服务访问其中一个存储库(LocationRepository)。

我可以在该服务中执行new LocationRepository(params)(我确实需要另一个实例,因为服务生命周期独立于应用程序的实例),但这不是很安全。
如果我改变了在匕首中创建服务的方式,我也会忘记更新服务。

那么有没有办法让一个组件的一部分(这里是LocationService)单独声明并在两个不同的组件中以相同的方式实例化?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望确保LocationRepository的定义(和实例化逻辑)在两个过程中是相同的。

如果是这种情况,您可以随时将其拉入自己的库模块,并让两个进程将该模块作为依赖项。你甚至可以在那里放一个@Component界面。

我不推荐它。

你最终会得到同一个单身人士的两个实例。这是不可避免的,因为进程彼此隔离,并且不共享内存。每个都有自己的VM。这将导致难以调试的数据争用,因为两个进程都从单个资源读取和写入。

对我来说,一个过程会拥有"更为有意义。它,并且另一个进程将通过进程间通信访问它,例如,通过AIDL界面,如Google Play服务客户端。

我认为一个进程托管一个长期服务,另一个进程托管你的UI。在这种情况下,您的服务是单身人士的自然所有者,您的UI流程将使用与服务通信的存储库的实现。这甚至可以参与注射;创建一个@Provide为LocationRepository的模块,并为其提供绑定服务连接。

这一切都非常高级;我希望它有意义并且有帮助。如果可以的话,很高兴提供更多细节!

答案 1 :(得分: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;