【问题标题】:Dagger multibinding java - for two or multiple implementationDagger multibinding java - 用于两个或多个实现
【发布时间】: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
  }

}

【问题讨论】:

    标签: java dagger-2 multibinding


    【解决方案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 表示(尽管您现在表示它的方式很好)。

    【讨论】:

    • 谢谢杰夫,我错过了地图“私人最终地图 engineMap;”一旦我声明了这一点,并添加了一个 getMethod,一切都按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多