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

时间:2016-10-02 15:58:37

标签: android dependency-injection dagger-2 autofactory

我正在使用 Dagger-2 (版本:2.7)和 AutoFactory (版本:1.0-beta3)。 我面临着一个特殊的问题。

我有一个类MyRequest,他的ctor采用2个参数:

  1. ConnectivityManager conmgr
  2. int somevalue
  3. 我创建了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>。

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

1 个答案:

答案 0 :(得分:3)

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

您可能希望FooConnectivityManager与所创建对象的所有实例(此处为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注入,您不必担心生成的工厂的生命周期,因此您可以回退到默认的无范围规定。