Dagger-2: Как создать разные экземпляры для одного и того же типа объекта в зависимости от их области действия? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть отношение компонент-субкомпонент.Каждый из них имеет различную область действия и использует свой собственный модуль, который обеспечивает зависимость того же типа.Что мне нужно, это различные экземпляры объекта в зависимости от области видимости.Кинжал не допустит этого, так как у меня будут «множественные привязки».Как бы я решил проблему без @ Named-Qualifiers?Например, есть ли способ перезаписи в подкомпоненте?

//Higher scoped object (in component)

    @Provides
    @ClientScope
    ISupResRankStrategy iSupResRankStrategy(@Named("GlobalModelConfig") JsonNode configSubTree,
            Lazy<SortByMagnitudeSum> strat1,
            Lazy<SortByShadowPercentage> strat2) {

        @SuppressWarnings("rawtypes")
        Map<String, Lazy> availableStrategies = new HashMap<>();
        availableStrategies.put(SortByMagnitudeSum.class.getSimpleName(), strat1);
        availableStrategies.put(SortByShadowPercentage.class.getSimpleName(), strat2);

        String configuredStrategy = configSubTree.findValue("ISupResRankStrategy").asText();
        return (ISupResRankStrategy) availableStrategies.get(configuredStrategy).get();
    }

//lower scoped object (in subcomponent)
@Provides
@ModelScope
ISupResRankStrategy iSupResRankStrategy(@Named("TradeModelConfig") JsonNode configSubTree,
        Lazy<SortByMagnitudeSum> strat1,
        Lazy<SortByShadowPercentage> strat2) {

    @SuppressWarnings("rawtypes")
    Map<String, Lazy> availableStrategies = new HashMap<>();
    availableStrategies.put(SortByMagnitudeSum.class.getSimpleName(), strat1);
    availableStrategies.put(SortByShadowPercentage.class.getSimpleName(), strat2);

    String configuredStrategy = configSubTree.findValue("ISupResRankStrategy").asText();
    return (ISupResRankStrategy) availableStrategies.get(configuredStrategy).get();
}

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Кинжал не допустит этого, так как у меня будут «множественные привязки». Как бы я решил проблему без @ Named-Qualifiers? Например, есть ли способ перезаписать в подкомпоненте?

Нет. У вас не может быть 2 объектов одного типа, доступных в разных областях одновременно. Как Кинжал должен знать, какой из 2 вы хотите?

Чтобы иметь несколько объектов одного вида, вы можете

  • использовать @Qualifier, @Named является одним из них, но вы можете создать свой собственный с лучшими именами, например, @Client, @Model
  • использовать зависимости компонентов вместо подкомпонентов, таким образом, вы не можете выставить объект зависимым компонентам, учитывая их собственный экземпляр
0 голосов
/ 08 апреля 2019

используйте @Qualifier, @Named. Вы можете перегрузить DI

например

 @Provides @Named("type1") 
  Model provideModel() {
  return new Model();
  }

 @Provides @Named("type2") 
 Model provideModeWithContext(Context context) {
 return new Model(context);
   }
...