2017-07-31 29 views
0

我正在处理的项目有许多需要活动上下文的实用程序类。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所有其他活动扩展。现在我不必声明我的Navigator依赖项x次数。

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

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

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

这是更好 - 我只需要重复此一个供应商每次活动,而不是重复每活动每个实用类的提供者,但它仍然感觉就像匕首不受欢迎的额外步骤设置,另一件事使代码更难理解。

是否有一种模式可以让我避免必须为每个活动提供此BaseActivity提供程序?

回答

3

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

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

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


如果你的等级取决于一个ActivityBaseActivity,那么你需要为它提供。是的,你必须以某种方式告诉Dagger这件事。

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

@Binds BaseActivity bindsBaseActivity(ActivityOne activity); 

相比@Provides匕首可能进一步优化这个代码,可以减少方法调用的数量和对象的创作,以及代码少一些行。


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

我个人只是将当前的Activity绑定到它使用上面的语法实现的类型。如果你正确地使用Constructor Injection,这通常不是你在模块中发现的唯一代码行,这使得它们非常易读。

+0

谢谢,我能够减少我的模块,只为当前活动的绑定,很好的反馈。 – user1173706

相关问题