Dagger multibinding java - 用于两个或多个实现
Posted
技术标签:
【中文标题】Dagger multibinding java - 用于两个或多个实现【英文标题】:Dagger multibinding java - for two or multiple implementation 【发布时间】:2021-09-02 09:51:01 【问题描述】:我正在尝试在 Java 代码(不是 android)中为具有两个或多个实现的接口创建一个 Dagger。我能够使用 javax 库使用 CDI 成功完成此操作,但这次我想根据我的项目需要使用 Dagger。我无法在编译期间调用正确的实现或事件解决依赖关系。我收到多个绑定或缺少绑定的错误。
我是 Dagger2 的新手,正在尝试解决这个问题。
所以我先开始创建界面:
public interface Engine
public startEngine();
引擎有两种实现汽油和柴油
public class PetrolEngine implements Engine
@Inject
public PetrolEngine()
@Override
public startEngine()
System.out.println("Petrol Engine Start");
public class DieselEngine implements Engine
@Inject
public DieselEngine()
@Override
public startEngine()
System.out.println("Diesel Engine Start");
模块创建为
@Module
public class EngineModule
@Provides
@IntoMap
@StringKey("Petrol")
public Engine providesEngine(PetrolEngine petrolEngine)
return petrolEngine;
@Provides
@IntoMap
@StringKey("Diesel")
public Engine providesEngine(DieselEngine dieselEngine)
return dieselEngine;
组件
@Component(module = EngineModule.class)
public interface EngineComponent
EngineService providesEngineService();
最后是调用汽油或柴油的服务
public call EngineService
private Engine engine;
@Inject
public EngineService(Engine engine)
this.engine = engine;
public void getEngineInstance()
//Some code to get the Petrol/Diesel Engine Instance
【问题讨论】:
【参考方案1】:在 EngineService 中,您需要注入 Map<String, Engine>
或 Map<String, Provider<Engine>>
,而不是注入 Engine。与the docs 一样,Map<String, Provider<Engine>>
“在您不希望实例化所有值时很有用,因为您要一次提取一个值,或者因为您想获得一个潜在的新实例每次查询地图时的每个值”。
public call EngineService
private final Map<String, Engine> engineMap;
@Inject
public EngineService(Map<String, Engine> engineMap)
this.engineMap = engineMap;
public void getEngineInstance()
engineMap.get("Petrol"); // to get a PetrolEngine
engineMap.get("Diesel"); // to get a DieselEngine
请注意,在一个实际的例子中,如果@StringKey("Petrol") Engine
的唯一实际绑定是PetrolEngine
,那么您不妨直接注入 PetrolEngine,其中@StringKey("Motorcycle") Engine
或@StringKey("Lorry") Engine
可能会突出显示 Dagger 的配置类型更实用。此外,像您这样简单的绑定也可以使用 @Binds
annotation 表示(尽管您现在表示它的方式很好)。
【讨论】:
谢谢杰夫,我错过了地图“私人最终地图以上是关于Dagger multibinding java - 用于两个或多个实现的主要内容,如果未能解决你的问题,请参考以下文章
ComboBox MultiBinding如何绑定到SelectedItem的属性