如何使用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
相关产品推荐
相关产品推荐

