我正在尝试使用Dagger 2,而我只是在测试一下以理解框架。
我有一个ApplicationComponent需要是整个应用程序的单例,所以我这样定义:
@Component(modules = {ApplicationModule.class})
@Singleton
public interface ApplicationComponent {
Context provideContext();
}
使用模块:
@Module
public class ApplicationModule {
private Application appContext;
public ApplicationModule(Application appContext) {
this.appContext = appContext;
}
@Provides
@Singleton
public Context provideContext() {
return appContext;
}
}
现在我还想要一个只要应用程序存在就需要生效的NetworkComponent。 该网络组件需要依赖ApplicationComponent。 所以我的网络组件如下:
@Component(dependencies = {ApplicationComponent.class}, modules = {NetworkModule.class})
@PerApp
public interface NetworkComponent extends ApplicationComponent {
@Named(DaggerConstants.DEFAULT_RETROFIT)
Retrofit provideDefault();
@Named(DaggerConstants.OTHER_RETROFIT)
Retrofit provideOther();
void inject(MainActivity activity);
}
模块:
@Module
public class NetworkModule {
@Named(DaggerConstants.DEFAULT_RETROFIT)
@PerApp
@Provides
Retrofit provideDefaultRetrofit() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.someurl.com/")
.build();
return retrofit;
}
@Named(DaggerConstants.OTHER_RETROFIT)
@PerApp
@Provides
Retrofit provideOtherRetrofit() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.someotherurl.com/")
.build();
return retrofit;
}
@PerApp
@Provides
SharedPreferences networkPreferences(Context context) {
return context.getSharedPreferences("network", Context.MODE_PRIVATE);
}
}
我有一些问题:
1)我将这两个组件存储在Android中的Application中。 但对我而言,我存储AppComponent和NetworkComponent似乎很奇怪。 我的ApplicationComponent应该提供NetworkComponent不是更好吗?
2)注释@PerApp和东西是否意味着什么,或者Dagger只是看到有一个具有@PerApp注释的实时对象,如果没有那么它会删除它?我不清楚这一点。
3)用例如@Singleton标记模块是否有用,因为它是可能的但我在任何例子中都看不到。
答案 0 :(得分:4)
我将这两个组件存储在Android中的Application中。但对我而言,我存储AppComponent和NetworkComponent似乎很奇怪。我的ApplicationComponent应该提供NetworkComponent不是更好吗?
您缺少组件的概念。组件背后的想法是拥有对象,它们的生命周期彼此不同。 例如:
A
应该是app singleton。每当你需要这个对象时,它就是完全相同的对象B
应该是活动单例。每次您的活动被销毁并创建时,都会创建一个新对象。对象C
应该是片段单例。每次将片段连接并分离到活动时,都会创建一个新对象。
因此,您指定希望ComponentC
具有ComponentB
的依赖关系,ComponentA
依赖于@PerApp
(假设每个提供相应的命名依赖关系。)
注释
ComponentB
和东西是否意味着什么,或者Dagger只是看到有一个具有@PerApp注释的实时对象,如果没有,那么它会删除它?我不清楚这一点。
自定义范围对于您负责的一生中的对象非常有用。即,如果您使用自定义范围声明了一个组件,则您负责清除该组件,此后,下次从组件中询问该依赖关系时,将为您创建一个新对象。
在上面的示例中,您必须在活动被销毁后立即对B
进行清空,否则下次要求时会为您提供相同的text?text
text?text
text**text**
text*text (text)
text *text*
text?
对象。< / p>
使用例如@Singleton标记模块是否有用,因为它是可能的但我在任何示例中都没有看到。
在提供依赖关系方面没有任何区别。但也许它会帮助你记住托管组件的范围。