Activity 使用 Dagger 2 的场注入

Activity Field Injection Using Dagger 2

在Dagger2中使用构造函数注入时,我真的可以看到依赖注入的概念是如何实现的:

 public class Dependent {

     @Inject
     public Dependent(Dependency dependency) {
         // We're dependent on an instance of the Dependency class
         // but we don't care who provides it
     }

 }

但是当涉及到一个Activity时,因为Android正在帮我们实例化它,所以我们需要使用Field Injection来满足我们的依赖。我在网上找到的所有示例都表明是这样的:

  1. 创建一个@Module class来提供我们的依赖。
  2. 创建一个@Component接口并调用generate builder实例化它。大多数示例在 Application class 中执行此操作并将引用保存为成员。
  3. 在我们的 Activity 中 - 创建我们的 @Inject 字段,并在 onCreate(..) 方法中,从我们的 Application 中获取对 Component 的引用并开始注射。

我对这种方法的问题是它感觉松散耦合,这正是我们正在努力实现的目标。

 public class DependentActivity extends Activity {

     @Inject Dependency mDependency;

     public void onCreate(final Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         ((MyApplication) getApplication()).getComponent().inject(this);

         // We're dependent on an instance of dependency
         // but now we not only know who provides it,
         // we explicitly initiate the injection
     }

 }

我错过了什么?

您启动注入,是的,但您不必知道它来自哪里(意味着对象是如何创建的,或者您是如何获得它的)。您可以关闭应用程序提供给您的组件 类,而您的 activity 不会改变。您可以切换出提供 Dependent 对象的模块,并且 activity 中的任何内容都不会改变。这种注入给你的是让你的 activity 只处理使用注入对象的能力。通常在没有依赖注入的情况下,你的 activity 必须了解如何实例化它,如何根据需要初始化它,以及如何使用它。这使您可以轻松地换入和换出组件,更改其初始化方式或其他任何方式,并且您的 activity(理想情况下)不必更改任何东西。