【问题标题】:How does Dagger2's built-in AssistedInject support factories that return interfaces instead of classesDagger2 内置的 AssistedInject 如何支持返回接口而不是类的工厂
【发布时间】:2021-03-13 15:47:59
【问题描述】:

我正在研究 Dagger2 及其内置的 AssisedInject 注释。 dagger.dev 提供的教程显示了一个示例,其中工厂方法返回一个具体类,但我希望工厂返回一个接口,该接口在某些模块中定义了实现绑定。

class MyDataService {
  @AssistedInject
  MyDataService(DataFetcher dataFetcher, @Assisted Config config) {}
}

// ---

@AssistedFactory
public interface MyDataServiceFactory {
  MyDataService create(Config config);
}

在 Google Guice 中,例如我可以使用工厂模块构建器创建一个模块,以将接口和实现结合在一起:

install(new FactoryModuleBuilder()
     .implement(Payment.class, RealPayment.class)
     .build(PaymentFactory.class));

Dagger2 AssistedInject 不可以吗?我对 Dagger 很陌生,也许我当时误解了这个概念。非常感谢任何帮助!

【问题讨论】:

    标签: interface dagger-2 assisted-inject


    【解决方案1】:

    是的,有可能:

    注释您想要帮助的参数,然后在您的具体实现中声明一个工厂(可以是抽象或接口),该工厂实现另一个Factory 接口,该接口返回您要绑定的接口,但现在您返回您的具体通过重写接口工厂返回类型实现

    interface RequestSetFactory {
        fun create(address: String): RequestSet
    }
    class MyRequestSet @AssistedInject constructor(
        @Assisted private val deviceAddress: String,
    ) : RequestSet {
    
        @AssistedFactory
        abstract class Factory : RequestSetFactory {
            abstract override fun create(address : String): MyRequestSet
        }
        //.... impl code
    }
    

    在绑定模块中添加映射为:

    @Module
    abstract class RequestSetProviderBindingModule {
    
        @Binds
        @IntoMap
        @StringKey(Key.MY_KEY) //<-- change this 
        abstract fun bindMyRequests(my: MyRequestSet.Factory): RequestSetFactory
    }
    

    将您的实例工厂中的提供者映射声明为:

    
    typealias RequestSetProviderMap = Map<String, @JvmSuppressWildcards Provider<RequestSetFactory>>
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 2021-04-09
      • 1970-01-01
      • 2013-06-04
      相关资源
      最近更新 更多