我正在使用 Dagger-2 (版本:2.7)和 AutoFactory (版本:1.0-beta3)。 我面临着一个特殊的问题。
我有一个类MyRequest,他的ctor采用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< ConnectivityManager>。
知道如何解决这个问题吗?
答案 0 :(得分:3)
与AutoFactory example一样,如果您的构造函数采用Foo
,则您的AutoFactory生成的构造函数将采用Provider<Foo>
。因此,对于Foo
的每次调用,您的工厂都会请求新的ConnectivityManager
(或get
),而不必在它们之间共享实例。
您可能希望Foo
或ConnectivityManager
与所创建对象的所有实例(此处为MyRequest
)成为同一个实例,但这适合您和Dagger口述,而不是AutoFactory。因此,AutoFactory将始终生成代码,无论您是否以这种方式使用它们,都需要提供商。
幸运的是,修复非常简单:Dagger可以像注入Provider<ConnectivityManager>
一样轻松地注入ConnectivityManager
(就像任何绑定一样),所以你可以改变你的@Provides
1}}这样的方法...
@Provides
@SystemScope
public final MyRequestFactory providesMyRequestFactory(
Provider<ConnectivityManager> connectivityManagerProvider {
return new MyRequestFactory(connectivityManagerProvider);
}
...但是因为您生成的工厂将有@Inject
注释,您可能最好完全删除@Provides
方法并让Dagger将该构造函数用于{{1}注射。虽然您会从MyRequestFactory
方法中丢失@SystemScope
范围注释,但这没有问题:通过上面的@Provides
注入,您不必担心生成的工厂的生命周期,因此您可以回退到默认的无范围规定。