Java Dagger-2:如何根据对象的范围为同一对象类型创建不同的实例化?
我有一个组件-子组件关系。每个都有不同的作用域,并使用自己的模块,该模块提供相同类型的依赖性。我需要的是基于范围的不同对象实例。Dagger不允许这样,因为我会有多个绑定。如果没有@Named限定符,我将如何解决问题?例如,是否有方法覆盖子组件中的内容Java Dagger-2:如何根据对象的范围为同一对象类型创建不同的实例化?,java,dependency-injection,dagger-2,Java,Dependency Injection,Dagger 2,我有一个组件-子组件关系。每个都有不同的作用域,并使用自己的模块,该模块提供相同类型的依赖性。我需要的是基于范围的不同对象实例。Dagger不允许这样,因为我会有多个绑定。如果没有@Named限定符,我将如何解决问题?例如,是否有方法覆盖子组件中的内容 //Higher scoped object (in component) @Provides @ClientScope ISupResRankStrategy iSupResRankStrategy(@Named("G
//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();
}
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();
}
没有。同一类型的两个对象不能同时具有不同的作用域。匕首怎么知道你想要这两个中的哪一个
要拥有多个相同类型的对象,可以
使用@Qualifier,@Named是其中之一,但您可以使用更好的名称创建自己的名称,例如@Client,@Model
使用组件依赖项而不是子组件,这样您就不能将对象公开给依赖组件,允许它们自己的实例
使用@Qualifier,@Named。你可以超载DI 例如
@Provides @Named("type1")
Model provideModel() {
return new Model();
}
@Provides @Named("type2")
Model provideModeWithContext(Context context) {
return new Model(context);
}
谢谢你的选择。从一开始我就不喜欢在代码中使用字符串!