我有一个ApplicationComponent
,可以访问我的存储库:
LocationRepository,PlaylistRepository,...
这些存储库都是@Singleton
。
到现在为止还挺好。
我的问题是我需要在另一个进程中从服务访问其中一个存储库(LocationRepository)。
我可以在该服务中执行new LocationRepository(params)
(我确实需要另一个实例,因为服务生命周期独立于应用程序的实例),但这不是很安全。
如果我改变了在匕首中创建服务的方式,我也会忘记更新服务。
那么有没有办法让一个组件的一部分(这里是LocationService)单独声明并在两个不同的组件中以相同的方式实例化?
答案 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;