为所有班级的孩子提供匕首

时间:2019-07-03 12:58:05

标签: android kotlin dagger

在创建一个高度模块化的应用程序时,我有很多需要注入的类,它们都是同一个类的子类(不是直接子类),它们都没有构造函数参数。

我想避免在我的模块中为每个人创建一个“ @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。

1 个答案:

答案 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)