繁体   English   中英

Dagger2-在组件中公开对象与在模块文件中提供对象时-

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM