[英]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的README中提取的,它將在@Inject
depB
構造函數中providedDepA
帶有depB
的SomeClassFactory
,並在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.