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 来表达(尽管您现在的表达方式很好)。