Dagger-2:如何根据对象范围为同一对象类型创建不同的实例?

时间:2019-04-05 16:25:51

标签: java dependency-injection dagger-2

我有一个组件-子组件关系。每个都有一个不同的范围,并使用各自的模块提供相同类型的功能。我需要的是基于范围的不同对象实例化。 Dagger不允许这样做,因为我将拥有“多个绑定”。如果没有@ Named-Qualifiers,我将如何解决问题?例如,有没有一种方法可以覆盖子组件?

os.path.exists
//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();
    }

2 个答案:

答案 0 :(得分:1)

  

Dagger不允许这样做,因为我将拥有“多个绑定”。如果没有@ Named-Qualifiers,我将如何解决问题?例如,有没有一种方法可以覆盖子组件?

没有。您不能同时具有两个具有不同范围的相同类型的对象。匕首应该如何知道您想要哪两个?

要拥有多个相同种类的对象

  • 使用@Qualifier@Named是其中之一,但是您可以使用更好的名称来创建自己的名称,例如@Client@Model
  • 使用组件依赖项而不是子组件,这样您就无法将对象暴露给依赖组件,而允许它们自己的实例

答案 1 :(得分:0)

使用@ Qualifier,@ Named。你可以重载DI

例如

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

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