簡體   English   中英

我可以在Dagger中使用某種輔助注射嗎?

[英]Can I use some kind of assisted Inject with Dagger?

使用Google Guice或Gin,我可以指定不受依賴項注入框架控制的參數:

class SomeEditor {


  @Inject
  public SomeEditor(SomeClassA a, @Assisted("stage") SomeClassB b) {
  }

}

在創建SomeEditor的實例時指定輔助參數stage

SomeClassA的實例是從對象圖中獲取的,而SomeClassB的實例是從運行時的調用者獲取的。

在Dagger中有類似的方法嗎?

因為工廠是一種單獨的樣板,可以進行優化( 請參閱此處的郵件列表討論 ),所以Dagger將其留給了姊妹項目AutoFactory 這提供了Guice通過FactoryModuleBuilder提供的“ 輔助注入 ”功能,但具有一些額外的好處:

  • 您可以繼續將AutoFactory與Guice或Dagger或任何其他JSR-330依賴項注入框架一起使用,因此即使在它們之間進行切換,也可以繼續使用AutoFactory。
  • 因為AutoFactory會生成代碼,所以您無需編寫用於表示構造函數的接口:AutoFactory將編寫一個全新的類型供您進行編譯。 (如果願意,或者從Guice遷移,也可以指定要實現的接口。)
  • 因為所有類型檢查都是在編譯時進行的,所以它會生成普通的舊Java,它不會因反射而變慢,並且可以與調試器和優化器一起很好地工作。 這使得Auto庫對於Android開發特別有用。

例如,從AutoFactory的README中提取的,它將在@Inject depB構造函數中providedDepA帶有depBSomeClassFactory ,並在create方法中create depB

@AutoFactory
final class SomeClass {
  private final String providedDepA;
  private final String depB;

  SomeClass(@Provided @AQualifier String providedDepA, String depB) {
    this.providedDepA = providedDepA;
    this.depB = depB;
  }

  // …
}

是的,請檢查以下Square項目: square / AssistedInject

目前還沒有在1.0中使用。 他們等到Dagger引入一個公共API來自動注冊那些生成的Module類-請參見此問題 這樣,您就不必在README中的本示例中在Dagger代碼中引用它們:

@AssistedModule
@Module(includes = AssistedInject_PresenterModule.class)
abstract class PresenterModule {}

就像@xsveda一樣,我在另一個問題中也寫了一個答案,我也會在這里重現。


今天,對於Dagger的輔助注入,您可能要使用AssistedInject 我在此博客文章中對此進行了介紹 ,但在我將添加一個完整的示例以簡化操作。

您需要的第一件事是依賴項:

compileOnly 'com.squareup.inject:assisted-inject-annotations-dagger2:0.4.0'
kapt 'com.squareup.inject:assisted-inject-processor-dagger2:0.4.0'

然后是這樣的:

class ImageDownloader @AssistedInject constructor(
  private val httpClient: HttpClient,
  private val executorService: ExecutorService,
  @Assisted private val imageUrl: URL,
  @Assisted private val callback: ImageCallback
) {

  @AssistedInject.Factory
  interface Factory {
    fun create(imageUrl: URL, callback: ImageCallback): ImageDownloader
  }
}

首先,我們不是使用@Inject注釋構造函數,而是使用@AssistedInject對其進行@AssistedInject 然后,我們注釋必須通過工廠的參數,這與AutoFactory期望的相反。 最后,我們需要一個內部工廠接口,該接口帶有@AssistedInject.Factory注釋,該接口具有單個方法,該方法接收輔助參數並返回我們感興趣的實例。

不幸的是,我們在這里還有一個額外的步驟:

@AssistedModule
@Module(includes = [AssistedInject_AssistedInjectModule::class])
interface AssistedInjectModule

即使這是一個有效的選擇,我們也不一定需要專用的模塊。 但是我們也可以在組件中已安裝的另一個模塊中具有這些注釋。 這里的好處是我們只需要執行一次,然后任何工廠都將自動成為圖形的一部分。

這樣,您就可以像通常那樣注入工廠並索要對象了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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