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

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@ModelScopeISupResRankStrategy 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贡献1831条经验 获得超10个赞

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

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

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

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

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


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

TA贡献1828条经验 获得超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
  • 2 回答
  • 0 关注
  • 72 浏览

添加回答

举报

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