为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2022-09-22 10:27:29

我有一个组件-子组件关系。每个都有不同的作用域,并使用自己的模块,该模块提供相同类型的缺陷。我需要的是基于范围的不同对象实例化。Dagger不会允许这样做,因为我将有“多个绑定”。如何在不@Named资格赛的情况下解决问题?例如,有没有办法覆盖子组件?


//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 回答

?
慕哥6287543

TA贡献1473条经验 获得超10个赞

Dagger不会允许这样做,因为我将有“多个绑定”。如何在不@Named资格赛的情况下解决问题?例如,有没有办法覆盖子组件?

没有。不能同时拥有 2 个具有不同作用域的相同类型的对象。匕首应该如何知道你想要的2个中的哪一个?

要拥有多个相同类型的对象,您可以

  • 使用 ,是其中之一,但您可以使用更好的名称创建自己的名称,例如,@Qualifier@Named@Client@Model

  • 使用组件依赖项而不是子组件,这样您就不能将对象公开给依赖组件,从而允许它们自己的实例


查看完整回答
反对 回复 2022-09-22
?
明月笑刀无情

TA贡献1494条经验 获得超4个赞

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


例如


 @Provides @Named("type1") 

  Model provideModel() {

  return new Model();

  }


 @Provides @Named("type2") 

 Model provideModeWithContext(Context context) {

 return new Model(context);

   }


查看完整回答
反对 回复 2022-09-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信