就像@xsveda 一样,我也写了一个关于这个in this other question 的答案,我也会在这里复制。
今天,对于 Dagger 的辅助注射,您可能想要使用 AssistedInject。我在this blogpost 中写过它,但我会在此处添加一个完整的示例以使事情变得更容易。
首先需要的是依赖项:
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 注释它。然后我们注释必须通过工厂的参数,这与 AutoFactory 所期望的相反。最后,我们需要一个带有 @AssistedInject.Factory 注释的内部工厂接口,它有一个接收辅助参数并返回我们感兴趣的实例的方法。
很遗憾,我们这里还有一个额外的步骤:
@AssistedModule
@Module(includes = [AssistedInject_AssistedInjectModule::class])
interface AssistedInjectModule
我们不一定需要专门的模块,即使这是一个有效的选项。但是我们也可以将这些注释放在已经安装在组件中的另一个模块中。这里的好处是我们只需要这样做一次,之后任何工厂都会自动成为图表的一部分。
有了它,你基本上可以像往常一样注入工厂并请求你的对象。