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

我有一个组件-子组件关系。每个都有不同的作用域,并使用自己的模块,该模块提供相同类型的缺陷。我需要的是基于范围的不同对象实例化。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();

}


偶然的你
浏览 74回答 2
2回答

慕哥6287543

Dagger不会允许这样做,因为我将有“多个绑定”。如何在不@Named资格赛的情况下解决问题?例如,有没有办法覆盖子组件?没有。不能同时拥有 2 个具有不同作用域的相同类型的对象。匕首应该如何知道你想要的2个中的哪一个?要拥有多个相同类型的对象,您可以使用 ,是其中之一,但您可以使用更好的名称创建自己的名称,例如,@Qualifier@Named@Client@Model使用组件依赖项而不是子组件,这样您就不能将对象公开给依赖组件,从而允许它们自己的实例

明月笑刀无情

使用@Qualifier,@Named。你可以重载 DI例如&nbsp;@Provides @Named("type1")&nbsp;&nbsp; Model provideModel() {&nbsp; return new Model();&nbsp; }&nbsp;@Provides @Named("type2")&nbsp;&nbsp;Model provideModeWithContext(Context context) {&nbsp;return new Model(context);&nbsp; &nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java