首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匕首-2:如何根据同一对象类型的作用域创建不同的实例化?

匕首-2:如何根据同一对象类型的作用域创建不同的实例化?
EN

Stack Overflow用户
提问于 2019-04-05 16:25:50
回答 2查看 354关注 0票数 0

我有一个组件-子组件关系。每个人都有不同的作用域,并使用他们自己的模块,这提供了相同类型的谦逊。我需要的是基于范围的不同的对象实例化。匕首不允许这样做,因为我会有“多个绑定”。如果没有@Named限定符,我将如何解决这个问题?例如,是否有一种在子组件中覆盖的方法?

代码语言:javascript
复制
//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();
    }
代码语言:javascript
复制
//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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-06 09:58:45

匕首不允许这样做,因为我会有“多个绑定”。如果没有@Named限定符,我将如何解决这个问题?例如,是否有一种在子组件中覆盖的方法?

没有。您不能同时拥有两个具有不同作用域的相同类型的对象。达格怎么知道你想要哪一个?

拥有相同类型的多个对象

  • 使用@Qualifier@Named是其中之一,但是您可以用更好的名称创建自己的名称,例如@Client@Model
  • 使用组件依赖关系而不是子组件,这样您就不能将对象公开给依赖组件,从而允许它们自己的实例。
票数 1
EN

Stack Overflow用户

发布于 2019-04-08 11:16:38

使用“限定符,”命名。您可以重载DI

为例

代码语言:javascript
复制
 @Provides @Named("type1") 
  Model provideModel() {
  return new Model();
  }

 @Provides @Named("type2") 
 Model provideModeWithContext(Context context) {
 return new Model(context);
   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55539768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档