在创建一个高度模块化的应用程序时,我有很多需要注入的类,它们都是同一个类的子类(不是直接子类),它们都没有构造函数参数。
我想避免在我的模块中为每个人创建一个“ @Provides”方法。
是否可以告诉dagger自动提供实现基本接口的所有类?还是可以自己使用反射来做?
我在Kotlin中使用dagger-android
更新:我会发布一些代码来说明
在其中一个模块中,我具有此接口
interface ExampleClass: BaseExample {
fun doSomething()
}
}
然后在主应用程序中实现它
class ExampleClassImpl @Inject constructor() : ExampleClass {
override fun doSomething(){
}
}
我需要的类是用匕首创建的Viewmodel,因此inject可在构造函数上使用。
class ExampleViewModel @Inject constructor(val exmpl :ExampleClass) : BaseViewModel {
}
我想注入那个ExampleClassImpl,为此,我需要创建一个带有@Provides或@Bind注释方法的@module并返回该类。
没有提供程序,我在编译时会收到错误:
错误:如果没有@Provides注释的方法,则无法提供[Dagger / MissingBinding] com.myapp.ExampleClassImpl。
答案 0 :(得分:0)
您想注入ExampleClass
,但是Dagger只知道ExampleClassImpl
。 Dagger怎么知道您想要那个特定的子类?
此外,您说您有要插入的许多子类。 Dagger怎么知道要向期望基类的构造函数提供哪一个?
如果您希望ExampleViewModel
获得ExampleClassImpl
的实例,则只需将声明更改为:
class ExampleViewModel @Inject constructor(val exmpl :ExampleClassImpl)
这样做会失去将构造函数参数与ExampleClass
的不同实现交换的能力。
另一种方法是每个子类有一个@Named @Provides
方法。像这样:
// In your module
@Provides
@Named("impl1")
fun provideExampleClassImpl1(impl: ExampleClassImpl): ExampleClass = impl
// When using the named dependency
class ExampleViewModel @Inject constructor(@Named("impl1") val exmpl :ExampleClass)