具有混合范围的模块

时间:2017-08-27 22:47:01

标签: java android dagger-2

我正在尝试实现以下行为:

  • 在另一个具有不同范围的模块中,使用单个作用域下的模块提供的对象。

这就是我所拥有的。我已根据几个答案尝试了很多变化,但我仍然无法解决这个问题。

第一个模块(应该绑定到应用程序的生命周期)

@Module
public class AModule {

private Context context;

public AModule(Context context) {
   this.context = context;
}    

@Provides
@Singleton
MySharedPreference provideMySharedPreference(SharedPreferences prefs) {
   return new MySharedPreferences(prefs);
}

@Provides
@Singleton
SharedPreference provideSharedPreference() {
   return context.getSharedPreferences("prefs", 0);
}

它的组件

@Component(modules = AModule.class)
@Singleton
public interface AComponent {
   void inject(...);
}

第二个模块(限于活动生命周期)

@Module
public class BModule {

   @Provides
   @ActivityScope
   X provideX(MySharedPreferences prefs) {
      return new Y(prefs);
   }
}

它的组件

@Component(modules = BModule.class)
@ActivityScope
public interface BComponent {
   Y Y();
}

我宣布了活动范围

@Scope
@Retenion(RetentionPolicy.RUNTIME)
public @interface ActivityScope{}

MySharedPreferences如下

public class MySharedPreferences {

   private SharedPreferences mSharedPrefs;

   @Inject
   public MySharedPreferences(SharedPreferences prefs) {
      mSharedPrefs = prefs;
   }

   // some methods
}

最后,在我的应用程序类中,我创建了一个A Component

aComponent = DaggerAComponent.builder().aModule(new AModule(getApplicationContext())).build();

编辑我试过的一些事情

我尝试将includes = AModule.class添加到BModule。 我尝试将dependencies = AComponent.class添加到BComponent。 我尝试使用ActivityScope注释创建一个新的Component。

1 个答案:

答案 0 :(得分:1)

如果您使用的是依赖组件(dependencies =),则需要编写一个提供方法来公开从@Singleton范围组件到@ActivityScope组件的依赖关系。

@Component(modules = AModule.class)
@Singleton
public interface AComponent {
   void inject(...);

   SharedPreferences exposeSharedPreferences();
}

提供方法将允许从属@ActivityScope组件对@Singleton使用SharedPreferences绑定:

@Component(modules = BModule.class, dependencies = AComponent.class)
@ActivityScope
public interface BComponent {
   Y Y();
}

有关提供方法的更详细说明,请参阅this question