什么是Dagger?为什么我们要使用它?

23

如何在我的Android项目中使用Dagger,使用它的主要目的是什么?我在谷歌上搜索过,但并不清楚。请给我最好的解决方案,并尽可能提供示例。


欢迎来到Stack Overflow。不幸的是,您的问题过于宽泛,无法完全适合我们的社区。我建议您阅读Dagger文档,并了解更多关于Android开发的知识。 - Code-Apprentice
1
如果你是Android新手,不要使用Dagger,除非你清楚了解需要解决的真实世界问题。 - Enzokie
1
我非常讨厌Dagger2。它是给懒人用的(: - Flávio Costa
1个回答

36

许多Android应用程序依赖于实例化通常需要其他依赖项的对象。例如,Twitter API客户端可能使用网络库Retrofit构建。要使用此库,您可能还需要添加解析库,例如Gson。此外,实现身份验证或缓存的类可能需要访问共享首选项或其他常见存储,需要首先实例化它们并创建固有的依赖关系链。

Dagger 2为您分析这些依赖关系并生成代码以帮助将它们连接起来。虽然还有其他Java依赖注入框架,但许多框架会受到XML依赖、在运行时需要验证依赖问题或在启动期间产生性能损失等方面的限制。Dagger 2仅使用Java注释处理器和编译时检查来分析和验证依赖项。它被认为是迄今为止最高效的依赖注入框架之一。

优点

以下是使用Dagger 2的其他优点列表:

  • 简化对共享实例的访问。就像ButterKnife库使定义对视图、事件处理程序和资源的引用更容易一样,Dagger 2提供了一种简单的方式来获取对共享实例的引用。例如,一旦我们在Dagger中声明了单例实例,如MyTwitterApiClient或SharedPreferences,我们就可以使用简单的@Inject注释声明字段:

    public class MainActivity extends Activity {
    
       @Inject MyTwitterApiClient mTwitterApiClient;
       @Inject SharedPreferences sharedPreferences;
    
       public void onCreate(Bundle savedInstance) {
           // assign singleton instances to fields
           InjectorClass.inject(this);
       }
    }
    
  • 轻松配置复杂的依赖关系。通常情况下,对象创建时存在一种隐式顺序。Dagger 2遍历依赖图并生成易于理解和追踪的代码,同时帮助您省去大量样板代码的编写。这些代码通常需要手动编写以获取引用并将它们传递给其他对象作为依赖项。此外,它还有助于简化重构,因为您可以专注于构建哪些模块而不是关注它们需要创建的顺序。

  • 更容易进行单元测试和集成测试。由于依赖图是由系统创建的,我们可以轻松替换掉处理网络响应的模块并模拟出它们的行为。

  • 作用域实例。通过Dagger 2不仅可以轻松管理整个应用程序生命周期的实例,而且还可以使用Dagger 2定义具有更短生命周期的实例(例如绑定到用户会话、活动生命周期等)。


9
考虑到配置Dagger需要大量的时间和精力,我觉得你的例子不够完整。 - TheRealChx101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接