2015-08-27 27 views
3

当使用构造器注入与Dagger2,我真的可以看到如何依赖注入的概念实现的:活动现场注射用匕首2

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类来提供我们的依赖关系。
  2. 创建一个@Component接口并调用generate builder来实例化它。大部分示例在Application类中执行此操作,并将引用另存为成员。
  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 
    } 

} 

我错过了什么?

回答

3

你开始注射,是的,但你不必知道它来自哪里(意思是如何创建对象,或如何得到它)。您可以切换出您的应用程序为您提供的组件类,并且您的活动不会改变。您可以切换出提供您的Dependent对象的模块,并且活动中的任何内容都不会改变。这种注入给你的是让你的活动只处理使用注入的对象的能力。通常,如果没有依赖注入,你的活动将不得不了解如何实例化它,如何用它需要的来初始化它,以及如何使用它。这可以让你轻松地进出组件,改变它的初始化方式,或者你的活动(理想情况下)不需要改变一件事情。

+0

所以猜我几乎明白了。谢谢你的回答,但我认为你所说的话有点乐观:你* *知道注射来自哪里,至少在表面上,但其余部分是真的 - 你不知道对象的创造并且可以切换出组件和模块。我猜想Dagger2的活动DI有一个活动的价格意识到它的注入器。好吧。支付小的价格。 –

+0

“您可以切换出您的应用程序为您提供的组件类,并且您的活动不会改变。”完全正确 – AskQ