簡體   English   中英

用Dagger 2注入子類型的類的最佳方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM