[英]Dagger2 - when to exposing objects in component vs providing them in a module file -
我在Dagger2中不清楚何时将对象本身暴露在组件中...让我们看一下我提供依赖项的常规方法:
@Module
public class NetworkModule {
private static final String NAME_BASE_URL = "_BASE_URL";
@Provides
@Named(NAME_BASE_URL)
String provideBaseUrlString() {
return "http://www.pomelo.baseURL.com";//Constants.BASE_URL;
}
@Provides
@Singleton
Converter.Factory provideGsonConverter() {
return GsonConverterFactory.create();
}
@Provides
@Singleton
Retrofit provideRetrofit(Converter.Factory converter, @Named(NAME_BASE_URL) String baseUrl) {
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(converter)
.build();
}}
然后,我将拥有一个AppComponent
,在该组件中,我将声明此模块已与该AppComponent绑定,并且还将声明要由其注入的所有类,如下所示:
@Singleton
@Component(modules = { NetworkModule.class})
public interface AppComponent {
void inject(MyActivity target);
}
但是我也看到了以下内容。 让我们以改造依赖为例:
@Singleton
@Component(modules = { NetworkModule.class})
public interface AppComponent {
Retrofit retrofit(); //what does it mean to define an object here ?
}
将对象本身放入组件中是什么意思? 网络模块中是否还需要provide方法? 执行此操作时我要声明什么?
执行此操作时我要声明什么?
组件可以通过这种类似结构的吸气剂来暴露依赖关系:
@Component
public interface AppComponent {
Retrofit retrofit(); // expose Retrofit
}
所做的只是简单地为您提供吸气剂或要提供的供应方法。
如果您想自己获取依赖项,则可以调用
Retrofit retrofit = appComponent.retrofit()
然后Dagger将创建/传递给您该对象。
网络模块中是否还需要provide方法?
当然。 这只是一个接口,它声明您的组件可以为其他组件提供Retrofit
。 Dagger只会实现接口,并且如果没有提供对象的方法,您将得到没有@Provides无法提供的所有众所周知的编译错误。
因此,是的,无论是在构造函数注入中还是从模块,父组件或依赖项访问组件,组件仍需要访问该对象。
那么,为什么需要这个呢?
在某些情况下,您需要对对象进行某些访问,但是不能或不会注入依赖项。 你可以用
@Component
public interface MyComponent {
Provider<SomeThing> someThing();
}
公开提供程序以创建SomeThing
类型的SomeThing
。 如果您打算创建某种工厂,而Dagger可以在其中为您创建和初始化组件,则这可能会很有用。
比较常见的方法是Dagger本身,只需查看组件依赖项即可 :
作为[子组件的替代方法],组件可以通过声明组件依赖性来仅使用来自另一个组件接口的绑定。
如果使用@Component(dependencies=SomeOtherComponent.class)
,则依赖组件只能访问上述声明的对象,并且如果从接口中删除Provisioning方法,则任何依赖组件都将无法再访问它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.