如何根据Context为不同的实现注入相同的Dagger 2依赖?

时间:2016-05-25 10:48:09

标签: android dependency-injection dagger-2

我有一个Dagger 2依赖项,如果它是Activity或其他某个上下文实例(例如,Service),则会以不同方式提供。两者都指代相同的接口,但它们的实现方式各不相同。我怎么能用Dagger 2组织这个?

现在,我正在尝试使用两个不同的组件ActivityComponentContextComponent及其各自的模块,如下所示:

@ActivityScope        
@Subcomponent(            
  modules = {                
    ActivityModule.class,                
    ContextModule.class
  })        
public interface ActivityComponent {
}

@Module    
public class ActivityModule {

    @Provides
    @MyActivityQualifier
    public MyObject provideMyObject() {
    }
}


@ContextScope
@Subcomponent(        
  modules = {
    ContextModule.class
  })    
public interface ContextComponent {    }

@Module
public class ContextModule.class {

    @Provides
    public MyObject provideMyObject() {
    }
} 

然后,如果我在MyObject中使用Activity,我必须按如下方式添加限定符:

@Inject @MyActivityQualifier MyObject myObject; 

这感觉不对,但我不确定为什么。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您正在使用子组件 问题是:可以或者两个对象是否可见"可见" (可用,可注射,......)同时?

  • 是: 必须使用某种限定符。否则你无法区分它们。
  • 否:您可以"隐藏"它们不会从依赖组件中暴露依赖项。在这种情况下,您必须使用普通组件而不是@Subcomponent,并且不要将getMyInterface()方法添加到您的父组件。

并且没有任何其他选项,因为您有2个组件相互依赖。因此,您提供的信息可以很好地处理您的方法。

注意您还可以获得一个的实施资格。在我的项目中,我使用合格的@Named("public")注释来实现没有用户数据的常见实现。如果我没有添加任何限定符,我将获得另一个限定符(不合格)。

使用独立的组件,例如ActivityAComponentActivityBComponent您可以切换使用不同模块提供的实现。