【问题标题】:Dagger component dependency meaningDagger 组件依赖含义
【发布时间】:2017-03-23 13:28:37
【问题描述】:

我正在试验 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 的应用程序中。 但对我来说,我存储 AppComponent 和 NetworkComponent 似乎很奇怪。 我的 ApplicationComponent 应该提供 NetworkComponent 不是更好吗?

2) @PerApp 注释和其他东西是否意味着什么,或者 Dagger 只是在寻找一个具有 @PerApp 注释的对象,如果没有,那么它会删除它?我不清楚。

3) 用例如@Singleton 标记模块是否有用,因为这是可能的,但我在任何示例中都看不到。

【问题讨论】:

    标签: java android dependency-injection dagger-2 dagger


    【解决方案1】:

    我将这两个组件存储在 Android 的应用程序中。但对我来说,我存储 AppComponent 和 NetworkComponent 似乎很奇怪。我的 ApplicationComponent 应该提供 NetworkComponent 不是更好吗?

    您缺少组件的概念。组件背后的想法是拥有对象,其生命周期彼此不同。 例如:

    • 对象A 应该是应用程序单例。每当您需要此对象时,它都会是完全相同的对象
    • 对象B 应该是活动单例。每次您的 Activity 销毁并创建时,都会创建一个新对象。
    • 对象C 应该是片段单例。每次你的片段被附加和分离到活动时,都会创建一个新对象。

      因此您指定,您希望 ComponentC 具有 ComponentB 的依赖关系,它依赖于 ComponentA(假设它们每个都提供适当的命名依赖关系。)

    注解@PerApp 和其他东西是不是意味着什么,或者Dagger 只是在寻找一个有@PerApp 注解的对象,如果没有,它会删除它吗?我不清楚。

    自定义范围对对象很有用,对象的生命周期由您负责。即,如果您已使用自定义范围声明了一个组件,则您有责任清除该组件,然后下次从组件询问该依赖项时,将为您创建一个新对象。

    在上面的示例中,您必须注意在您的活动被销毁时立即将ComponentB 清空,否则它会在您下次请求时为您提供相同的B 对象。

    使用例如@Singleton 标记模块是否有用,因为这是可能的,但我在任何示例中都看不到。

    在提供依赖项方面没有任何区别。但也许它会帮助您记住托管组件的范围。

    【讨论】:

    • 非常感谢。
    • @RautDarpan,拥有YourAwesomeComponent c,以这种方式无效c = null;
    猜你喜欢
    • 2015-08-07
    • 2017-02-26
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多