Dagger 2 - 如何避免代码重复注入需要活动上下文的依赖项

时间:2017-07-31 15:02:23

标签: android dependency-injection dagger-2

我正在处理的项目有许多需要活动上下文的实用程序类。

我不想为每个使用依赖项的活动声明一个新的@Provides方法。即我不想要这个:

@Provides
static Navigator providesNavigator(ActivityOne activity) {
    returns new Navigator(activity);
}

// ...and in another module

@Provides
static Navigator providesNavigator(ActivityTwo activity) {
   returns new Navigator(activity);
}

因此,我在单个ActivityUtilitiesModule中声明这些实用程序,并传递我们的所有其他活动扩展的BaseActivity。现在我不必多次声明导航器依赖关系x。

@Provides
static Navigator(BaseActivity activity) {
    return new Navigator(activity);
}

但是,Dagger不知道如何满足BaseActivity的依赖性。这意味着我需要创建一个提供方法,以满足使用特定Activity的BaseActivity依赖关系。 e.g:

@Provides
static BaseActivity providesBaseActivity(ActivityOne activity) {
    return activity;
}

这样做更好 - 我只需要为每个活动重复这一个提供程序,而不是为每个活动重复每个实用程序类的提供程序,但它仍然感觉在Dagger设置中是一个不受欢迎的额外步骤,另一个使得代码更难理解。

是否有一种模式允许我避免每次活动提供此BaseActivity提供程序?

1 个答案:

答案 0 :(得分:3)

请使用构造函数注入。使用只调用构造函数的provide*方法只是要维护的噪声和代码。将@Inject添加到类构造函数中,并将可能的范围添加到类中。

@SomePossibleScope
class Navigator {
  @Inject
  Navigator(Activity activity) { }
}

如果这样做,您可能根本不需要ActivityUtilitiesModule。

如果您的课程取决于ActivityBaseActivity,那么您需要提供该课程。是的,你必须以某种方式告诉Dagger。

如果您要使用抽象类或接口,则应使用@Binds代替。

@Binds BaseActivity bindsBaseActivity(ActivityOne activity);

@Provides相比,Dagger可能会进一步优化此代码,减少方法调用和对象创建的数量,以及减少一些代码行。

我不知道为什么你的Utils依赖于Activity,但是如果他们只需要一个Context那么你也可以只为他们提供应用程序上下文而无需绑定或提供你的实际活动。

我个人只是使​​用上面的语法将当前的Activity绑定到它实现的类型。如果您正确使用构造函数注入,那么通常我会在模块中找到唯一的代码行,使它们非常易读。