Dagger multibinding java - 用于两个或多个实现
Dagger multibinding java - for two or multiple implementation
我正在尝试在 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
}
}
在 EngineService 中,您需要注入 Map<String, Engine>
或 Map<String, Provider<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 来表达(尽管您现在的表达方式很好)。
我正在尝试在 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
}
}
在 EngineService 中,您需要注入 Map<String, Engine>
或 Map<String, Provider<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 来表达(尽管您现在的表达方式很好)。