You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Dagger实现可生成同一接口多个实现类的Assisted Factory?

使用Dagger实现支持多实现类的Assisted Factory

好问题!在Dagger中实现支持同一接口多实现类的Assisted Factory其实比Guice更直接——Dagger从2.31版本开始原生支持Assisted Injection,不需要像Guice那样手动编写FactoryModuleBuilder。下面我一步步给你演示具体实现:

1. 准备依赖

首先确保你的项目中引入了Dagger Assisted相关依赖(以Java Gradle项目为例):

dependencies {
  // 核心Dagger依赖
  implementation 'com.google.dagger:dagger:2.51.1'
  annotationProcessor 'com.google.dagger:dagger-compiler:2.51.1'
  // Assisted Injection依赖
  implementation 'com.google.dagger:dagger-assisted:2.51.1'
  annotationProcessor 'com.google.dagger:dagger-assisted-processor:2.51.1'
}

Kotlin项目只需要把annotationProcessor替换成kapt即可。

2. 定义接口与多实现类

假设我们有一个PaymentProcessor接口,以及两个实现类CreditCardProcessor和PayPalProcessor——它们都需要注入一些单例依赖(比如日志工具Logger),同时需要接收外部传入的辅助参数(比如支付金额、用户邮箱)。

// 核心业务接口
public interface PaymentProcessor {
  void processPayment();
}

// 信用卡支付实现:需要注入Logger,以及外部传入的金额
public class CreditCardProcessor implements PaymentProcessor {
  private final Logger logger;
  private final BigDecimal amount;

  // 使用@Inject标记构造方法,@Assisted标记辅助参数
  @Inject
  public CreditCardProcessor(Logger logger, @Assisted BigDecimal amount) {
    this.logger = logger;
    this.amount = amount;
  }

  @Override
  public void processPayment() {
    logger.info("Processing credit card payment: $" + amount);
  }
}

// PayPal支付实现:需要注入Logger,以及外部传入的金额和用户邮箱
public class PayPalProcessor implements PaymentProcessor {
  private final Logger logger;
  private final BigDecimal amount;
  private final String userEmail;

  // 多个辅助参数时,用@Assisted+限定符区分(比如这里的"userEmail")
  @Inject
  public PayPalProcessor(Logger logger, @Assisted BigDecimal amount, @Assisted("userEmail") String userEmail) {
    this.logger = logger;
    this.amount = amount;
    this.userEmail = userEmail;
  }

  @Override
  public void processPayment() {
    logger.info("Processing PayPal payment: $" + amount + " for user " + userEmail);
  }
}

3. 定义Assisted Factory接口

创建一个工厂接口,用@AssistedFactory注解标记——Dagger会自动为这个接口生成实现类。接口中定义多个方法,每个方法对应一个实现类的创建逻辑,返回值统一为父接口类型:

import dagger.assisted.AssistedFactory;

@AssistedFactory
public interface PaymentProcessorFactory {
  // 创建信用卡支付处理器,传入金额辅助参数
  PaymentProcessor createCreditCardProcessor(@Assisted BigDecimal amount);

  // 创建PayPal支付处理器,传入金额和用户邮箱辅助参数
  PaymentProcessor createPayPalProcessor(@Assisted BigDecimal amount, @Assisted("userEmail") String userEmail);
}

注意:辅助参数的注解要和实现类构造方法中的完全一致(包括限定符)。

4. 在Dagger组件中暴露工厂

修改你的Dagger组件,把刚才定义的工厂加入到提供列表中:

import dagger.Component;

@Component
public interface AppComponent {
  // 暴露PaymentProcessorFactory供外部调用
  PaymentProcessorFactory paymentProcessorFactory();

  // 提供其他需要注入的依赖(比如Logger)
  Logger logger();
}

5. 实际使用工厂

现在你可以从Dagger组件中获取工厂实例,调用不同的方法创建对应实现类的对象:

public class Main {
  public static void main(String[] args) {
    // 初始化Dagger组件
    AppComponent component = DaggerAppComponent.create();
    PaymentProcessorFactory factory = component.paymentProcessorFactory();

    // 创建信用卡支付实例并使用
    PaymentProcessor ccProcessor = factory.createCreditCardProcessor(new BigDecimal("199.99"));
    ccProcessor.processPayment();

    // 创建PayPal支付实例并使用
    PaymentProcessor paypalProcessor = factory.createPayPalProcessor(new BigDecimal("49.99"), "user@example.com");
    paypalProcessor.processPayment();
  }
}

和Guice实现的区别

Guice中通常需要用FactoryModuleBuilder手动绑定工厂和实现类,而Dagger通过@AssistedFactory注解自动生成工厂实现,不需要额外的模块代码,流程更简洁。

内容的提问来源于stack exchange,提问作者BOB123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:37:36