Dagger 2 问题覆盖单个提供了来自应用使用的库中的模块的带注释的方法
GitHub 项目链接
我在GitHub上做了一个项目,它是我的项目实际架构的匕首2架构的模型。这个问题将基于GitHub项目。
我在这个问题中提供了许多代码片段,但是,在Android Studio中自己编译项目以了解问题可能会更容易。
如果签出代码,它将不会编译。进入AppModule.java并注释掉两者都提供了方法,它应该编译。
主要问题是这篇文章的最后一行。
https://github.com/qazimusab/Dagger2LibraryProject
建筑
我有一个库,其中包含制作应用程序所需的所有代码。这种架构的要点是,我在项目中创建的每个应用程序都应该能够使用库,并且通过dagger 2,能够为它自己的模块中想要的任何单个类或活动提供不同的实现。此时,我在此示例项目中只有一个使用该库的应用程序。
问题
使用dagger one,我具有相同的体系结构,并且在特定于应用程序的模块(与库模块相反)中,我能够添加一个新的提供注释的方法,以覆盖任何库模块中提供的任何实现,只要
- 该方法位于应用模块的模块中
- 该方法用@Provides
- 该方法的返回类型与要重写的方法具有相同的返回类型
使用 Dagger 2,当我不覆盖任何提供时,或者如果我覆盖了该模块中的每个提供,并从应用程序特定模块的包含中删除该模块,则体系结构可以正常工作。
例如,在我的项目中,我有一个应用程序和一个库。
该应用程序有一个AppModule;图书馆有一个CatModule,提供Cat和CatFood,一个狗模块提供Dog and DogFood,以及一个LibraryModule提供活动。
猫咪.java
package com.example.qaziahmed.library.application.modules;
import com.example.qaziahmed.library.classes.Cat; import
com.example.qaziahmed.library.classes.CatFood; import
com.example.qaziahmed.library.classes.contract.ICat; import
com.example.qaziahmed.library.classes.contract.ICatFood;
import javax.inject.Singleton;
import dagger.Module; import dagger.Provides;
/** * Created by qaziahmed on 11/23/15. */ @Module public class
CatModule {
@Provides
@Singleton
ICat provideCat() {
return new Cat();
}
@Provides
ICatFood provideCatFood(){
return new CatFood();
} }
狗模块.java
package com.example.qaziahmed.library.application.modules;
import com.example.qaziahmed.library.classes.Dog; import
com.example.qaziahmed.library.classes.DogFood; import
com.example.qaziahmed.library.classes.contract.IDog; import
com.example.qaziahmed.library.classes.contract.IDogFood;
import javax.inject.Singleton;
import dagger.Module; import dagger.Provides;
/** * Created by qaziahmed on 11/23/15. */ @Module public class
DogModule {
@Provides
@Singleton
IDog provideDog() {
return new Dog();
}
@Provides
IDogFood provideDogFood(){
return new DogFood();
}
}
因此,在我的应用程序模块中,我想提供ICat的家猫实现而不是通用猫和IDogFood的AllNaturalDogFood实现,而不仅仅是常规的DogFood,然后在我的AppModule中,我添加了两个提供来覆盖那些
应用模块.java
package com.example.qaziahmed.dagger2libraryproject.application;
import
com.example.qaziahmed.dagger2libraryproject.classes.AllNaturalDogFood;
import com.example.qaziahmed.dagger2libraryproject.classes.HouseCat;
import com.example.qaziahmed.library.application.modules.CatModule;
import com.example.qaziahmed.library.application.modules.DogModule;
import
com.example.qaziahmed.library.application.modules.LibraryModule;
import com.example.qaziahmed.library.classes.contract.ICat; import
com.example.qaziahmed.library.classes.contract.IDogFood;
import javax.inject.Singleton;
import dagger.Module; import dagger.Provides;
/** * Created by ogre on 2015-07-12 */ @Module(includes = {
LibraryModule.class,
DogModule.class,
CatModule.class }) public class AppModule {
@Provides
@Singleton
ICat provideHouseCat() {
return new HouseCat();
}
@Provides
IDogFood provideAllNaturalDogFood(){
return new AllNaturalDogFood();
} }
现在,当我运行此设置时,这是我得到的错误:
Error:com.example.qaziahmed.library.classes.contract.ICat 被绑定多次: @Provides @Singleton com.example.qaziahmed.library.classes.contract.ICat com.example.qaziahmed.dagger2libraryproject.application.AppModule.provideHouseCat() @Provides @Singleton com.example.qaziahmed.library.classes.contract.ICat com.example.qaziahmed.library.application.modules.CatModule.provideCat() Error:com.example.qaziahmed.library.classes.contract.IDogFood 被绑定多个times: @Provides com.example.qaziahmed.library.classes.contract.IDogFood com.example.qaziahmed.dagger2libraryproject.application.AppModule.provideAllNaturalDogFood() @Provides com.example.qaziahmed.library.classes.contract.IDogFood com.example.qaziahmed.library.application.modules.DogModule.provideDogFood()
现在,如果在 AppModule.java 中,我还添加了提供注释的方法来提供 Cat Food 和 Provide Dog,然后从 App Module 中的包含中删除 CatModule.class 和 DogModule.class然后它就可以工作了。
但是,整个问题是,如何覆盖库中某个模块中的单个提供方法,而不必覆盖该特定模块中的每个提供注释方法,然后从 AppModule 中的 include 中删除该模块.java