Dagger可以用来在内容提供商上执行注入吗?

时间:2014-05-26 14:04:17

标签: android dagger

我最近将Dagger整合到一个使用ContentProviders的项目中。我在自定义Application对象中创建了一个ObjectGraph实例,基本上在每个托管组件中:

  • 活动,
  • 片段,
  • 服务

...然后,我调用getApplication(),向下转换到我的自定义Application对象,并通过我的Application类中的一些自定义实现强制注入。这似乎是基于我在Square看到的人发布的样本进行注射的规定方法。

这种模式不适用于ContentProvider实例,因为它们的生命周期与Application对象的生命周期没有预期的关联,即ContentProviders可以,并且正如我经常观察的 ,在创建Application对象之前创建(出于我尚未理解的原因)。

所以...有没有人有一个使用Dagger注入ContentProviders的好方法?到目前为止,我已经通过在每个ContentProvider的接口方法(插入,查询,更新,删除)的开头调用isInjected()来实现它...基本上是一种懒惰的初始化形式。但这似乎远非理想。是否有更规定的方法来注入ContentProviders?

1 个答案:

答案 0 :(得分:11)

Application子类只是一个约定,因为它通常是第一个创建的对象。我们的应用程序没有内容提供商,这就是我们使用它们的原因。没有什么可以说你不能把它放在其他地方。

您可以使用传统的单例模式来实例化并保留对ObjectGraph的引用。

public final class Dagger {
  static ObjectGraph og;

  static ObjectGraph og() {
    if (og == null) {
      og = ObjectGraph.create(..);
    }
    return og;
  }
}

第一个访问者将初始化将在流程生命周期中使用的实例。

如果您的内容提供商与主应用程序的流程不同,则此解决方案仍然有效。或者您可以在创建内容提供商时简单地创建图表,因为它将是唯一的消费者。当然,正常的多进程规则仍然适用,因此不会与其他进程共享任何实例。