就像@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
。然后我们注释必须通过工厂的参数,这与 AutoFactory 所期望的相反。最后,我们需要一个带有注解的内部工厂接口,@AssistedInject.Factory
它有一个接收辅助参数并返回我们感兴趣的实例的方法。
不幸的是,我们在这里还有一个额外的步骤:
@AssistedModule
@Module(includes = [AssistedInject_AssistedInjectModule::class])
interface AssistedInjectModule
我们不一定需要专门的模块,即使这是一个有效的选项。但是我们也可以将这些注释放在已经安装在组件中的另一个模块中。这里的好处是我们只需要执行一次,之后任何工厂都会自动成为图表的一部分。
有了它,你基本上可以像往常一样注入工厂并请求你的对象。