No se puede inyectar la misma instancia en un Servicio y un ViewModel

Estoy tratando de replicar esto este Singleton usando Dagger 2.

Me gustaría tener un BehaviorSubject en el que llamo onNext() a un service y me subscribe() a en un ViewModel.

Aquí está mi object Singleton:

 object MyMessageBus { val pusher = BehaviorSubject.create<String>() } 

En mi Servicio, puedo hacer esto:

 private val pusherObservable = MyMessageBus.pusher override fun onCreate() { super.onCreate() println("service myObservable = ${pusherObservable.hashCode()}") } 

y luego en mi ViewModel puedo hacer esto:

 private val pusherObservable = MyMessageBus.pusher init { println("viewModel myObservable = ${pusherObservable.hashCode()}") } 

Cuando corro con esto obtengo el mismo observable tanto en el Servicio como en el Modelo de Vista.

viewModel myObservable = 218654319

service myObservable = 218654319

y entonces puedo llamar a Next en el Servicio y observar el cambio en ViewModel.

Como dije antes, estoy tratando de replicar esto usando Dagger, pero parece que no puedo get la misma instancia tanto en el Servicio como en el Modelo de Vista. Creo que el problema es que solo tengo dos charts diferentes, pero no puedo entender cómo unirme a ellos, incluso después de leer los documentos y conocer los Subcomponentes .

Además de eso, esto parece una gran cantidad de código para hacer algo tan simple.

Entonces mi pregunta es ¿cómo hago el equivalente usando Dagger con la cantidad mínima de código?


Esto es lo que he intentado hasta ahora:

Aquí está la class que quisiera insert en el Servicio y ViewModel.

Nota: Originalmente pensé que simplemente anotar la class y el constructor funcionaría, pero también lo he intentado con un module (de ahí los comentarios)

 //@Singleton class MessageBus { val pusher: BehaviorSubject<String> // @Inject constructor() { pusher = BehaviorSubject.create<String>() } } 

Aquí está el module para proporcionar las inyecciones de service

 @Singleton @Module() abstract class AndroidModule { @ContributesAndroidInjector abstract fun contributesPusherService(): PusherService } 

Aquí está el module que proporciona el MessageBus (Nota: también intenté simplemente usar las annotations comentadas anteriormente).

 @Module class PervasiveModule { @Provides @Singleton fun provideMessageBus() = MessageBus() } 

El siguiente es el componente de la aplicación

 @Singleton @Component(modules = arrayOf(AndroidInjectionModule::class, AndroidModule::class, PervasiveModule::class)) interface AppComponent { @Component.Builder interface Builder { @BindsInstance fun application(myApp: MyApp): Builder fun build(): AppComponent } fun inject(myApp: MyApp): MyApp } 

finalmente el componente para ViewModel.

 @Component(modules = arrayOf(PervasiveModule::class)) @Singleton interface MainViewModelComponent { @Component.Builder interface Builder { fun build(): MainViewModelComponent } fun inject(mainViewModel: MainViewModel) } 

En el service que tengo:

 @Inject lateinit var messageBus: MessageBus override fun onCreate() { AndroidInjection.inject(this) super.onCreate() setupPusher() println("service created") println("service messageBus = ${messageBus.hashCode()}") } 

En el ViewModel tengo:

 @Inject lateinit var messageBus: MessageBus init { DaggerMainViewModelComponent.create().inject(this) println("view model messageBus = ${messageBus.hashCode()}") } 

Cuando ejecuto esto, todo se inyecta, pero termino con dos instancias de MessageBus en lugar de una.

ver model messageBus = 252114254

service messageBus = 91479273

Como dije antes, creo que el problema es que MainViewModelComponent y AppComponent son en realidad dos charts diferentes. ¿Es este el caso? Si es así, ¿cómo me uno a ellos? Si no, ¿alguien puede explicar lo que está sucediendo y cómo hacer que esto funcione?