[英]What is the best way to inject a class of a child type with Dagger 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
的構造DummyChild
需要一個參數,它將變得很復雜。 在這種情況下,還需要注入參數。
@Module
class TestModule() {
@Provides
@Singleton
fun provideDummy(Context context): Dummy = DummyChild(context)
}
在上述情況下,還需要提供context
。 您應該有一個可以提供上下文的公開Provides方法。
還是有更直接的方法,例如通過使用帶有某些參數的構造函數注入?
絕對!
@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
的實現細節,而不是接口,但是如果您願意,您當然也可以將其添加到方法中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.