了解Dagger2流程(提供样本)

时间:2016-06-20 12:13:30

标签: java android dependency-injection rx-java dagger-2

我正试图在我的项目中使用Dagger 2来使用Retrofit,RxJava,MVP实现。然而,我从阅读指南和观看视频开始很小,当我认为我理解它是如何工作时,似乎我没有。 Here是我想要了解的样本。

模块:

@Module
public class AppModule {
  private App app;

  public AppModule(App app) {
    this.app = app;
  }

  @Provides @Singleton public SharedPreferences provideSharedPreferences() {
    return PreferenceManager.getDefaultSharedPreferences(app);
  }

  @Provides @Singleton public HelloModel provideHelloModel(SchedulerProvider schedulerProvider,
      HelloDiskCache helloDiskCache, HelloService helloService, Clock clock) {
    return new HelloModel(schedulerProvider, helloDiskCache, helloService, clock);
  }

  @Provides public HelloDiskCache provideHelloDiskCache(SharedPreferences prefs) {
    return new HelloDiskCache(prefs);
  }

  @Provides public HelloService provideHelloService() {
    return new HelloService();
  }

  @Provides public SchedulerProvider provideSchedulerProvider() {
    return SchedulerProvider.DEFAULT;
  }

  @Provides public Clock provideClock() {
    return Clock.REAL;
  }

  @Provides @Nullable public LayoutInflaterFactory provideLayoutInflaterFactory() {
      return null;
  }

组件

@Component(
    modules = AppModule.class
)
@Singleton
public interface AppComponent {
  HelloModel getHelloModel();
  HelloDiskCache getHelloDiskCache();
  MainActivity inject(MainActivity activity);
  HelloFragment inject(HelloFragment fragment);
}

在片段中,注入了演示者(这是来自哪里?)

  @Inject HelloPresenter presenter;

在演示者中,有一个构造函数注入

  @Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;

}

那么,为什么我们可以在片段中注入一个演示者,为什么我们可以在演示者中注入?答案不一定非常复杂我只是感到愚蠢,因为我无法追踪它的来源。

2 个答案:

答案 0 :(得分:1)

@Inject - 带注释的构造函数是@Provides的替代方法 - 在没有太多配置要做的情况下用于依赖的注释方法。

由于HelloPresenter具有这样的构造函数,Dagger会自动发现它并能够注入此依赖项或使用它来构造和提供图中的其他对象。

带有@Inject注释构造函数的类本身可以使用范围注释(例如@Singleton)进行注释。在这种情况下,只有具有匹配范围的组件才能看到它。

通常,这种提供依赖关系的方式较不详细,但并不总是可以使用它(例如,ActivitySharedPreferences)。在这种情况下,您必须使用@Module@Provides方法。

答案 1 :(得分:0)

您可以看一下Dagger2与MVP体系结构一起使用的示例

Dagger2 Android with MVP