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来满足我们的依赖。我在网上找到的所有示例都表明是这样的:
- 创建一个
@Module
class来提供我们的依赖。
- 创建一个
@Component
接口并调用generate builder实例化它。大多数示例在 Application
class 中执行此操作并将引用保存为成员。
- 在我们的
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(理想情况下)不必更改任何东西。
在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来满足我们的依赖。我在网上找到的所有示例都表明是这样的:
- 创建一个
@Module
class来提供我们的依赖。 - 创建一个
@Component
接口并调用generate builder实例化它。大多数示例在Application
class 中执行此操作并将引用保存为成员。 - 在我们的
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(理想情况下)不必更改任何东西。