Dagger2 - 何时暴露组件中的对象与在模块文件中提供它们 -

时间:2017-06-14 19:07:00

标签: android dagger-2

我不清楚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 ?
}

将对象本身放入组件中意味着什么?我还需要网络模块中的提供方法吗?当我这样做时,我该宣布什么?

1 个答案:

答案 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),只有那些声明如上所述的对象才能被依赖组件访问,如果从界面中删除了提供方法,任何相关组件都将无法访问它。

相关问题