gpt4 book ai didi

android - 使用 Dagger-2 和 Autofactory 时实现辅助注入(inject)的问题

转载 作者:行者123 更新时间:2023-11-29 17:13:48 25 4
gpt4 key购买 nike

我正在使用 Dagger-2(版本:2.7)和 AutoFactory(版本:1.0-beta3)。我遇到了一个特殊问题。

我有一个 MyRequest 类,它的构造函数有两个参数:

  1. 连接管理器配置
  2. 整数值

我创建了 ctor 为

@Autofactory
public MyRequest(@Provider ConnectivityManager conmgr, int somevalue){
//
}

我有一个包含以下内容的模块

@Provides
@SystemScope
public final ConnectivityManager provideConnectivityManager(App app) {
return (ConnectivityManager)
app.getSystemService(Context.CONNECTIVITY_SERVICE);
}

在同一模块中,我执行以下操作

@Provides
@SystemScope
public final MyRequestFactory providesMyRequestFactory(ConnectivityManager connectivityManager {
return new MyRequestFactory(connectivityManager);
}

我遇到了构建错误 不兼容的类型:无法将 ConnectivityManager 转换为 Provider

知道如何解决这个问题吗?

最佳答案

如在 AutoFactory example ,如果您的构造函数采用 Foo ,您的 AutoFactory 生成的构造函数将采用 Provider<Foo>反而。这样您的工厂就会申请新的 Foo (或 ConnectivityManager )每次调用一次 get无需在它们之间共享实例。

可能是你想要的FooConnectivityManager对于所创建对象的所有实例(此处为 MyRequest),都是相同的实例,但这是由您和 Dagger 决定的,而不是 AutoFactory。因此,AutoFactory 将始终生成采用 Provider 的代码,无论您是否以这种方式使用它们。

幸运的是,修复非常简单:Dagger 可以注入(inject) Provider<ConnectivityManager>就像它可以注入(inject) ConnectivityManager 一样容易(对于任何绑定(bind)都可以),因此您只需更改 @Provides像这样的方法...

@Provides
@SystemScope
public final MyRequestFactory providesMyRequestFactory(
Provider<ConnectivityManager> connectivityManagerProvider {
return new MyRequestFactory(connectivityManagerProvider);
}

...但是因为您生成的工厂将有一个 @Inject注释,您最好删除 @Provides方法并让 Dagger 为 MyRequestFactory 使用该构造函数注入(inject)。虽然你会失去 @SystemScope来自 @Provides 的范围注释方法,没问题:使用 Provider<ConnectivityManager>上面的注入(inject),您不必担心生成的工厂的生命周期,因此您可以回退到默认的无范围规定。

关于android - 使用 Dagger-2 和 Autofactory 时实现辅助注入(inject)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39818848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com