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

【讨论】:

谢谢杰夫,我错过了地图“私人最终地图 engineMap;”一旦我声明了这一点,并添加了一个 getMethod,一切都按预期工作。

以上是关于Dagger multibinding java - 用于两个或多个实现的主要内容,如果未能解决你的问题,请参考以下文章

ComboBox MultiBinding如何绑定到SelectedItem的属性

Dagger Dagger-MissingBinding]

MultiBinding

WPF MultiBinding 和 IMultiValueConverter 进行布尔运算

MultiBinding 中的 XAML 文本格式

java MyApp的。 Dagger2。子