【译文】Dagger辅助注入

本文详细介绍了Dagger框架中的辅助注入(Assisted Injection)模式,解释了它如何帮助构造对象并处理部分参数由用户提供的场景。内容包括@AssistedInject和@AssistedFactory的使用方法,与@Inject的差异,以及如何解决@Assisted修饰相同类型参数的歧义。此外,还讨论了Dagger的辅助注入与其他辅助注入库如AutoFactory和Square的AssistedInject的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是Dagger官网Assisted Injection教程的译文,英语好的同学可以直接阅读原文Assisted Injection,自测需要翻墙。

辅助注入是一种依赖注入 (DI) 模式,用于构造一个对象。它的特点是构造对象其中一些参数可能由 DI 框架提供,而其他参数必须在创建时(也称为“辅助”)由用户传入。

通常有一个factory负责组合所有参数并创建对象。

(相关: guice/AssistedInject)。

Dagger辅助注射

要使用 Dagger 的辅助注入,请使用 @AssistedInject 标签对一个对象的构造函数注解,并使用 @Assisted标签注解由你传入的辅助参数,如下所示:

class MyDataService @AssistedInject constructor(
    dataFetcher: DataFetcher,
    @Assisted config: Config
) {}

接下来,定义一个可用于创建对象实例的factory。factory必须被注解 @AssistedFactory 并且必须包含一个抽象方法,该方法返回@AssistedInject类型并包含所有之前在对象中用@Assisted注解的参数(参数顺序一致)。如下所示:

@AssistedFactory
interface MyDataServiceFactory {
  fun create(config: Config): MyDataService
}

最后,Dagger 将为创建AissistedFactory辅助工厂的实现并为其提供绑定。这个factory可以作为依赖项注入,如下所示。

class MyApp {
  @Inject lateinit var serviceFactory: MyDataServiceFactory;

  fun setupService(config: Config): MyDataService {
    val service = serviceFactory.create(config)
    ...
    return service
  }
}

与@Inject 的比较

一个@AssistedInject修饰的构造函数看起来与@Inject修饰的构造函数非常相似。但也存在一些重要的差异。

  1. @AssistedInject类型不能直接注入,只有 @AssistedFactory可以。即使构造函数不包含任何辅助参数,也是如此。
  2. @AssistedInject 类型不能被限定。

消除@Assisted修饰的相同类型参数的歧义

如果多个@Assisted修饰的参数具有相同的类型,则必须通过给它们一个标识符来区分它们。可以通过通过@Assisted(“name”)注解添加名称来完成 。这部分必须放在工厂方法和@AssistedInject类型上。

例如:

class MyDataService @AssistedInject constructor(
    dataFetcher: DataFetcher,
    @Assisted("server") serverConfig: Config,
    @Assisted("client") clientConfig: Config
) {}

@AssistedFactory
interface MyDataServiceFactory {
  fun create(
    @Assisted("server") serverConfig: Config,
    @Assisted("client") clientConfig: Config
  ): MyDataService
}

注意:不幸的是,使用参数名称来消除参数的歧义是不可能的,因为有些情况下参数名称并没有保留。请参阅此问题以获取更多信息。

AutoFactory 和 Square 的 AssistedInject 怎么样?

对于 Dagger 用户,我们建议使用 Dagger 的辅助注入,而不是其他辅助注入库,如 AutoFactory或 square/AssistedInject。这些库的存在早于 Dagger 的辅助注入,虽然它们可以与 Dagger 一起使用,但它们需要一些额外的样板才能与 Dagger 集成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值