用匕首2注入一类儿童类型的最佳方法是什么?



它只是为了在模块中提供子类型吗?还是通过使用构造函数注入一些参数来直接的方法?

@Module
class TestModule() {
  @Provides
  @Singleton
  fun provideDummy(): Dummy = DummyChild()
}
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var dummy: Dumy
    override fun onCreate(savedInstanceState: Bundle?) {
       ...
    }
    ...
}

这就是需要完成的方式。该模块提供可以注入的组件。

在上述情况下,TestModule是可以提供DummyChild的模块。如果DummyChild的构造函数需要参数,则会变得复杂。在这种情况下,也需要注入参数。

@Module
class TestModule() {
@Provides
@Singleton
fun provideDummy(Context context): Dummy = DummyChild(context)
}

在上述情况下,还需要提供context。您应该有一个裸露的方法可以提供上下文。

或通过使用构造函数注入一些参数?

是否有更直接的方法?

绝对!

@Module
class TestModule() {
  @Provides
  @Singleton
  fun provideDummy(): Dummy = DummyChild() // bad, we construct it ourselves!
}

您应该让dagger关心对象的来源,因此调用构造函数通常不是一个好主意(除非这确实是您想要的(。绑定实现的正确方法是使用@Provides方法并要求孩子直接返回或仅使用@Binds注释,该注释有效地相同,但可能比@Provides更优化。

@Module
class TestModule() {
  @Provides
  fun provideDummy(implementation : DummyChild): Dummy = implementation // better!
  // or with @Binds
  @Binds
  abstract fun provideDummy(implementation : DummyChild): Dummy // also good
}
@Singleton class DummyChild @Inject constructor()

请注意,我从方法中删除了@Singleton,因为这通常是DummyChild的实现细节,而不是接口,但是如果您愿意,您当然仍然可以将其添加到该方法中。

最新更新