【发布时间】:2018-03-13 15:36:40
【问题描述】:
我从头开始着手开发一个新的 Android 项目。在了解了项目范围和要求的功能之后,我提出了一个模块化架构(基本上将每个功能包装到一个功能或 android 模块中),如下所示
在我想引入 dagger 来粘合所有模块之前,一切看起来都很完美。问题是我希望每个模块都有自己的匕首组件/子组件和它的模块,以便提供依赖关系并将它们公开给其他组件或父组件使用的图形。
Google 官方 Dagger 文档指出子组件可以直接访问父组件依赖项,反之则不然。然而,在我的例子中,基础组件需要依赖于数据模块,而后者本身需要依赖于网络模块。
知道我希望每个 android 模块最好都有自己的子组件,有没有解决这个问题的方法?如果没有,有什么解决办法吗?
谢谢。
编辑: 这是我的项目结构的样子
这就是我设置匕首图的方式
我的 AppComponent(匕首根)
@Singleton
@Component(modules = {
AppModule.class,
ActivityBuilder.class,
AndroidSupportInjectionModule.class
})
public interface AppComponent {
void inject(CatApp application);
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
}
我的应用模块
@Module(subcomponents = DataComponent.class)
public class AppModule {
@Provides
@Singleton
Context provideContext(Application application) {
return application.getApplicationContext();
}
}
我的DataComponent(位于数据android模块)
@Subcomponent(modules = DataModule.class)
public interface DataComponent {
@Subcomponent.Builder
interface Builder {
DataComponent build();
}
}
应该提供SystemManager实现的数据模块(位于数据android模块)
@Module(subcomponents = NetworkComponent.class)
public class DataModule {
@Provides
@Singleton
ISystemManager provideSystemManager(SystemManager systemManager) {
return systemManager;
}
}
网络组件(位于网络 Android 模块)
@Subcomponent(modules = NetworkModule.class)
public interface NetworkComponent {
@Subcomponent.Builder
interface Builder {
NetworkComponent build();
}
}
网络模块(位于网络 Android 模块)并应提供 INetWorkManager 的实现
@Module
public class NetworkModule {
@Provides
@Singleton
INetworkManager provideNetworkManager(NetworkManager networkManager) {
return networkManager;
}
}
我在所有构造函数中都使用@Inject 注释,所以我的配置全部设置,但问题是 dagger 出于某种原因没有编译这些子组件,编译时出现此错误:
Error:(27, 8) error: [dagger.android.AndroidInjector.inject(T)] com.github.andromedcodes.network.INetworkManager cannot be provided without an @Provides-annotated method.
com.github.andromedcodes.network.INetworkManager is injected at
com.github.andromedcodes.data.SystemManager.<init>(networkManager)
com.github.andromedcodes.data.SystemManager is injected at
com.github.andromedcodes.data.di.DataModule.provideSystemManager(systemManager)
com.github.andromedcodes.domain.managers.ISystemManager is injected at
com.github.andromedcodes.domain.interactors.CheckSystemAvailability.<init>(systemManager)
com.github.andromedcodes.domain.interactors.CheckSystemAvailability is injected at
com.github.andromedcodes.chasseautrsor.views.Splash.SplashPresenter.<init>(checkSystemAvailability)
com.github.andromedcodes.chasseautrsor.views.Splash.SplashPresenter is injected at
com.github.andromedcodes.chasseautrsor.di.SplashModule.bindSplashPresenter(presenter)
com.github.andromedcodes.chasseautrsor.views.Contract.Presenter is injected at
com.github.andromedcodes.mvp.BaseActivity.mPresenter
com.github.andromedcodes.chasseautrsor.views.SplashScreenActivity is injected at
dagger.android.AndroidInjector.inject(arg0)
如果知道我想在 Data android Module 上提供 ISystemManager 实现,在 Network Android Module 上提供 INetworkManager 实现,我该如何解决这个问题?
谢谢。
【问题讨论】:
-
也许您想向我们展示您拥有的东西?如果您正在寻找一种入门方法,这是我最喜欢的示例:adityaladwa.wordpress.com/2016/05/11/…
-
@DinorahTovar 请检查我的编辑。
标签: java android dependency-injection dagger-2 modularity