我不清楚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 ?
}
将对象本身放入组件中意味着什么?我还需要网络模块中的提供方法吗?当我这样做时,我该宣布什么?
答案 0 :(得分:2)
当我这样做时,我宣布了什么?
组件可以通过此类getter结构公开依赖项:
@Component
public interface AppComponent {
Retrofit retrofit(); // expose Retrofit
}
这样做只是简单地提供一个吸气剂,或提供方法来提供。
如果您想自己获取依赖关系,可以直接调用
Retrofit retrofit = appComponent.retrofit()
并且Dagger将创建/传递对象。
我还需要网络模块中的提供方法吗?
当然。这只是一个界面,声明您的组件可以为其他人提供Retrofit
。 Dagger只会实现接口,如果没有办法提供对象,你可能会得到所有众所周知的编译错误在没有@Provides的情况下无法提供......
所以是的,组件仍然需要访问对象,无论是构造函数注入,模块,父组件还是依赖项,都会发生这种情况。
那你为什么需要这个?
可能存在您需要对对象进行某些访问的情况,但无法或不会注入您的依赖项。你可以用
@Component
public interface MyComponent {
Provider<SomeThing> someThing();
}
公开提供程序以创建SomeThing
类型的对象。如果您计划创建某种工厂,那么这可能很有用,您可以让Dagger为您创建和初始化组件。
更常见的方法是在Dagger本身,只需查看component dependencies:
作为[子组件]的替代方案,组件只能通过声明组件依赖关系来使用来自另一个组件接口的绑定。
如果使用@Component(dependencies=SomeOtherComponent.class)
,只有那些声明如上所述的对象才能被依赖组件访问,如果从界面中删除了提供方法,任何相关组件都将无法访问它。