android - Dagger 2 混合瞄准镜

标签 android dependency-injection scope components dagger-2

以前我只有一个 AppComponent 和四个模块(AppModuleNetworkModuleStorageModule PresentersModule) 和到处注入(inject)的单例。最近,我决定在我的应用程序中进行小型重构并将其划分为范围。我认为,Presenter 只能存在于 Activity 中,所以我创建了 @ActivityScopeActivityModule,但是由于我误解了如何混合这些范围,所以项目无法编译。 我在 stackoverflow 上阅读了很多文章和问题,但到处都有模块独立的简单示例。就我而言,例如

@Singleton
@Component(modules = { AppModule.class, StorageModule.class, NetworkModule.class })
public interface AppComponent {
  ActivityComponent plus(PresentersModule module); // <-- error
}

不工作。我收到此错误:

Error:(19, 1) error: com.my.package.di.component.ActivityComponent scoped with @com.my.package.di.scope.ActivityScope may not reference bindings with different scopes:
@Provides @Singleton android.app.Application com.my.package.di.module.AppModule.provideApplication()
@Provides @Singleton com.my.package.network.FeedBurnerApi com.my.package.di.module.NetworkModule.provideFeedBurnerApi(android.app.Application)
@Provides @Singleton android.database.sqlite.SQLiteOpenHelper com.my.package.di.module.StorageModule.provideSQLiteOpenHelper(android.app.Application)
@Provides @Singleton com.my.package.storage.Repository com.my.package.di.module.StorageModule.provideRepository(android.database.sqlite.SQLiteOpenHelper)
@Provides @Singleton com.my.package.SharedPreferencesHelper com.my.package.di.module.StorageModule.provideSharedPreferencesHelper(android.app.Application)

那么,问题是如何获取 ActivityComponent 的实例?

您可以在下面看到模块之间的依赖关系:

应用模块:

@Module
public final class AppModule {
  private final MyApplication mApplication;

  public AppModule(MyApplication application) { ... }

  @Provides @Singleton Application provideApplication() { ... }
}

网络模块:

@Module(includes = { AppModule.class })
public final class NetworkModule {
  @Provides @Singleton FeedBurnerApi provideFeedBurnerApi(Application application) { ... }

  @Provides @Singleton Retrofit provideRetrofit() { ... }
}

存储模块:

@Module(includes = { AppModule.class })
public final class StorageModule {
  @Provides @Singleton Repository provideRepository(SQLiteOpenHelper sqLiteOpenHelper) { ... }

  @Provides @Singleton SQLiteOpenHelper provideSQLiteOpenHelper(Application application) { ... }

  @Provides @Singleton SharedPreferencesHelper provideSharedPreferencesHelper(Application application) { ... }
}

演示者模块:

@Module(includes = { AppModule.class, NetworkModule.class, StorageModule.class })
public final class PresentersModule {
  @Provides FeedPageViewPresenter provideFeedPageViewPresenter(FeedBurnerApi api, Repository repository, SharedPreferencesHelper preferences) { ... }

  @Provides @ActivityScope SlidingTabsViewPresenter provideSlidingTabsViewPresenter(Repository repository) { ... }
}

应用组件:

@Singleton
@Component(modules = { AppModule.class, StorageModule.class, NetworkModule.class })
public interface AppComponent {}

Activity 组件:

@Subcomponent(modules = PresentersModule.class)
@ActivityScope
public interface ActivityComponent {
  void inject(FeedPageView view);

  void inject(SlidingTabsView view);
}

最佳答案

问题出在我的 PresentersModule 中。

因为子组件可以从它们的父组件访问整个对象图,所以我不需要在我的子模块中包含这些依赖项。 所以,我更改了这段代码:

@Module(includes = { AppModule.class, NetworkModule.class, StorageModule.class })
public final class PresentersModule { ... }

用这个:

@Module
public final class PresentersModule { ... }

它解决了我的问题。

关于android - Dagger 2 混合瞄准镜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33620909/

相关文章:

Android加载库错误——无法映射段

android - 如何在 Android 4.0+ 中发送带附件的彩信

dependency-injection - 如何创建即将到期的单例绑定(bind)?

gwt - GIN @Inject on variable for Rpc Services

java - Spring @Configuration @Bean - 如何获取有关 bean 创建的更多上下文信息?

JavaScript 变量作用域

android - 是否可以将 ViewGroups 项目带到 ViewGroups sibling 的前面?

python - 高级嵌套列表理解语法

perl - 在 Perl 中,local() 可以创建变量吗?

android - 通过 Intent 发送未知对象而不分解它