了解 Dagger2 流程(提供的示例)
Understanding the Dagger2 Flow (Sample provided)
我正在尝试在我的项目中使用 Retrofit、RxJava、MVP 实现 Dagger 2。然而,我是从阅读指南和观看视频开始的,就在我认为我理解它是如何工作的时候,似乎我没有。 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);
}
在片段中,presenter 被注入(这是从哪里来的?)
@Inject HelloPresenter presenter;
并且在presenter中,有一个构造函数注入
@Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;
}
那么,为什么我们可以在fragment中注入一个presenter,为什么我们可以在presenter中注入呢?答案不必很详细我只是觉得很愚蠢,因为我无法追踪它来自哪里。
@Inject
-注解的构造函数是 @Provides
-注解的依赖方法的替代方法,当没有太多配置要做时。
由于 HelloPresenter
有这样的构造函数,Dagger 会自动发现它并能够注入这种依赖关系或使用它来构造和提供图中的其他对象。
带有 @Inject
注释的构造函数的 class 本身可以用范围注释(例如,@Singleton
)进行注释。在这种情况下,只有具有匹配范围的组件才能看到它。
一般来说,这种提供依赖性的方式不那么冗长,但并非总是可以使用它(例如,Activity
、SharedPreferences
)。在这种情况下,您必须使用 @Module
和 @Provides
方法。
您可以查看此示例,其中 Dagger2 与 MVP 架构一起使用
我正在尝试在我的项目中使用 Retrofit、RxJava、MVP 实现 Dagger 2。然而,我是从阅读指南和观看视频开始的,就在我认为我理解它是如何工作的时候,似乎我没有。 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);
}
在片段中,presenter 被注入(这是从哪里来的?)
@Inject HelloPresenter presenter;
并且在presenter中,有一个构造函数注入
@Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;
}
那么,为什么我们可以在fragment中注入一个presenter,为什么我们可以在presenter中注入呢?答案不必很详细我只是觉得很愚蠢,因为我无法追踪它来自哪里。
@Inject
-注解的构造函数是 @Provides
-注解的依赖方法的替代方法,当没有太多配置要做时。
由于 HelloPresenter
有这样的构造函数,Dagger 会自动发现它并能够注入这种依赖关系或使用它来构造和提供图中的其他对象。
带有 @Inject
注释的构造函数的 class 本身可以用范围注释(例如,@Singleton
)进行注释。在这种情况下,只有具有匹配范围的组件才能看到它。
一般来说,这种提供依赖性的方式不那么冗长,但并非总是可以使用它(例如,Activity
、SharedPreferences
)。在这种情况下,您必须使用 @Module
和 @Provides
方法。
您可以查看此示例,其中 Dagger2 与 MVP 架构一起使用