首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用Dagger-2和Autofactory时实施辅助注射的问题

在使用Dagger-2和Autofactory时实施辅助注射的问题
EN

Stack Overflow用户
提问于 2016-10-02 15:58:36
回答 1查看 1.3K关注 0票数 1

我使用的是Dagger-2 (ver: 2.7)和AutoFactory (ver: 1.0-beta3 3)。我正面临一个特殊的问题。

我有一个类MyRequest,它的ctor接受两个参数:

  1. ConnectivityManager conmgr
  2. [医]总人数

我把ctor创建为

代码语言:javascript
复制
@Autofactory
public MyRequest(@Provider ConnectivityManager conmgr, int somevalue){
//
}

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

代码语言:javascript
复制
@Provides
@SystemScope
public final ConnectivityManager provideConnectivityManager(App app) {
return (ConnectivityManager)       
app.getSystemService(Context.CONNECTIVITY_SERVICE);
}

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

代码语言:javascript
复制
@Provides
@SystemScope
public final MyRequestFactory providesMyRequestFactory(ConnectivityManager connectivityManager {
    return new MyRequestFactory(connectivityManager);
}

我正在获取构建错误不兼容类型: ConnectivityManager不能转换为Provider < ConnectivityManager >。

知道怎么解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2016-10-02 20:12:11

与AutoFactory 示例一样,如果构造函数采用Foo,则自动工厂生成的构造函数将采用Provider<Foo>。这样,您的工厂将为每次调用Foo (或ConnectivityManager)请求一次新的get,而不必在它们之间共享实例。

在这种情况下,您可能希望FooConnectivityManager成为创建对象的所有实例(此处为MyRequest)的相同实例,但这是由您和Dagger命令,而不是AutoFactory。因此,无论您是否以这种方式使用提供程序,AutoFactory都会生成使用提供程序的代码。

幸运的是,修复非常容易: Dagger可以像注入Provider<ConnectivityManager>一样简单地注入ConnectivityManager (就像任何绑定一样),所以您可以像这样更改@Provides方法.

代码语言:javascript
复制
@Provides
@SystemScope
public final MyRequestFactory providesMyRequestFactory(
        Provider<ConnectivityManager> connectivityManagerProvider {
    return new MyRequestFactory(connectivityManagerProvider);
}

因为生成的工厂将有一个@Provides注释,所以最好完全删除@Provides方法,让Dagger使用 MyRequestFactory injections的构造函数。虽然您将丢失来自@SystemScope方法的@Provides范围注释,但这并不是问题:使用上面的Provider<ConnectivityManager>注入,您不必担心生成工厂的生命周期,因此可以回到默认的非作用域提供。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39818848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档