Daga 2: inputs múltiples con la misma key

Breve explicación

Diagtwig UML simplificado que describe por architecture de Components .

enter image description here

Y hay una exception:

 java.lang.IllegalArgumentException: Multiple entries with same key: gson=com.example.di.AppPresentationComponent and gson=com.example.di.gamesession.GameSessionComponent 

Dagger 2 no puede decidir a partir de qué Component proporcionar una instancia de Gson .

Nunca trabajo con inheritance múltiple. ¿Qué puedes recomendar para resolver mi situación?

Puedo deshacerme de GameSessionComponent y mover gameSessionManager() a GameSessionPresentationComponent . Funcionará en mi caso, pero suena como una solución sucia.

Hay algún código.

AppComponent:

 @PerApplication @Component(modules = arrayOf( AppModule::class, TextsModule::class, AudioModule::class, FontsModule::class, TexturesModule::class, QuestModule::class, GameSaveModule::class )) interface AppComponent { fun componentsHolder(): ComponentsHolder fun gdxContext(): GdxContext fun rxHelper(): RxHelper fun textsManager(): TextsManager fun soundsManager(): AudioManager fun fontsManager(): FontsManager fun texturesManager(): ThemesManager fun questManager(): QuestManager fun gameSaveManager(): GameSaveManager } 

AppPresentationComponent

 @PerApplicationPresentation @Component( dependencies = arrayOf(AppComponent::class), modules = arrayOf(AppPresentationModule::class) ) interface AppPresentationComponent : AppComponent { fun fonts(): Fonts fun audio(): Audio fun texts(): Texts fun textures(): Textures fun router(): KRQRouter fun launch(): LaunchScreen fun mainMenu(): MenuScreen fun settingsDialog(): SettingsDialog fun questInfoDialog(): InfoDialog } 

GameSessionComponent

 @PerGameSession() @Component( dependencies = arrayOf(AppComponent::class), modules = arrayOf(GameSessionModule::class) ) interface GameSessionComponent : AppComponent { fun storyTeller(): StoryTeller } 

GameSessionPresentationComponent

 @PerGameSessionPresentation @Component( dependencies = arrayOf(AppPresentationComponent::class), modules = arrayOf(GameSessionPresentationModule::class, GameSessionModule::class) ) interface GameSessionPresentationComponent : AppPresentationComponent { fun storyTeller(): StoryTeller fun story(): StoryScreen fun gameoverDialog(): GameoverDialog fun inGameMenu(): InGameMenu fun donateDialog(): DonateDialog } 

La guía del usuario de Dagger habla sobre dos types de enlaces:

Los enlaces publicados son aquellos que proporcionan funcionalidad utilizada por otras partes de la aplicación.

Los enlaces internos son el rest: enlaces que se utilizan en la implementación de algún tipo publicado y que no están destinados a ser utilizados, excepto como parte de él. Estos enlaces son generalmente para types de packages privados o están calificados con calificadores de packages privados.

Probablemente necesite pensar en esto cuando diseñe sus modules y componentes. Lo que tienes actualmente:

 interface AppPresentationComponent : AppComponent interface GameSessionComponent : AppComponent interface GameSessionPresentationComponent : AppPresentationComponent 

es una jerarquía en la que cada componente publica todos sus enlaces a los componentes dependientes. Esto es bastante confuso, especialmente porque su jerarquía de interfaces no sigue la jerarquía de componentes a componentes dependientes. Configurado de esta manera, es fácil get un enlace duplicado. Idealmente, no debería llegar a una situación en la que tenga que razonar acerca de la inheritance múltiple de los componentes.

En esta etapa, le sugiero que refactorice las interfaces de sus componentes para que no se henetworkingen entre sí y podrá descubrir qué enlaces deben publicarse en componentes dependientes y cuáles pueden (y deben) internalizarse.

Lo mismo aplica para tus modules. Al igual que un componente, un module puede publicar e internalizar un enlace. ¿Por qué no enlazar GSON en otro module en el nivel ApplicationComponent y publicarlo en componentes dependientes? A continuación, puede deshacerse de la unión de GSON dentro de GameSessionModule que parece estar causando el problema.

  • Kotlin y Spark: problemas de SAM
  • Kotlin: matriz de generics
  • ¿Puedes tener un constructor primario genérico en Kotlin?
  • Configurar la reflexión de kotlin, class.java no funciona
  • Apache FOP 2.2 incluye fonts usando ruta relativa
  • Kotlin ingresó como un BigInteger
  • ¿Cómo funcionan las funciones de order superior de Kotlin?
  • Cómo get el valor emitido desde el primer observable
  • notifyDataSetChanged () no llama al método onBindViewHolder ()
  • Manera más limpia de reasignar el valor de la variable cuando la condición se cumple en Kotlin
  • Clases internas selladas