MyApp和MyAppCore有自己的AppComponent,MyApp提供ViewModel工厂,MyAppCore提供数据库和网络访问工厂(下面的示例)。
我不确定如何链接AppComponent(或应用程序),以便在MyApp中提供数据库和网络访问。以下是我目前掌握的信息:
MyAppCore模块
open class CoreApp : Application() {
val appComponent: AppComponent by lazy {
initializeComponent()
}
open fun initializeComponent(): AppComponent {
return DaggerAppComponent.builder()
.build()
}
}
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
@Module
class AppModule {
@Singleton
@Provides
fun provideDb(app: Application) = MyDb.getInstance(app)
@Singleton
@Provides
fun provideCommentDao(db: MyDb) = db.commentDao()
}
@Singleton
class CommentRep @Inject constructor(private val dao: CommentDao) {
fun saveComment(comment: Comment){
dao.insert(comment)
}
}
MyAppCore还具有名为mydb
的Room数据库实现和接口commodao
(我认为我不需要在这个问题中添加此代码)。
MyApp模块
MyApp
open class MyApp : Application(), DaggerComponentProvider {
override val appComponent: AppComponent by lazy {
initializeComponent()
}
open fun initializeComponent(): AppComponent {
return DaggerAppComponent.builder()
.applicationContext(applicationContext)
.build()
}
}
interface DaggerComponentProvider {
val appComponent: AppComponent
}
val Activity.injector get() = (application as DaggerComponentProvider).appComponent
@Singleton
@Component
interface AppComponent{
@Component.Builder
interface Builder {
@BindsInstance
fun applicationContext(applicationContext: Context): Builder
fun build(): AppComponent
}
fun commentsViewModelFactory(): ViewModelFactory<CommentsViewModel>
}
ViewModelFactory
class ViewModelFactory<VM : ViewModel> @Inject constructor(
private val viewModel: Provider<VM>
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>) = viewModel.get() as T
}
class CommentsViewModel @Inject constructor(private val repository: CommentRep) : ViewModel() {
fun saveComment(comment: Comment){
repository.saveComment(comment)
}
}
然后我的活动,注入虚拟机,但我认为他们没有必要包括他们的代码在这个问题。
当然,如果我这样编译我的项目,就不会生成来自MyAppCore的图,因此我会得到需要提供commentDAO
的错误,因为commentrep
需要提供commentrep
commentsviewmodel所使用的图。我猜想MyAppCore应用程序类被MyApp应用程序类重写,因此MyAppCore的AppComponent
从未实例化,因此从未在我的图中添加所有内核的注入。我如何解决这个问题?提前感谢!
只需使用一个组件。首先,将MyAppCore模块添加到MyApp的gradle依赖项中。然后,让MyApp模块提供包含两个项目模块中的所有dagger模块的组件。
您还可以将MyAppCore模块更改为库模块,因为您只需要一个应用程序模块。在build.gradle
文件中,替换:
apply plugin: 'com.android.application'
到
apply plugin: 'com.android.library'
implementation project(":myappcore")
@Singleton
@Component(modules=[MyAppCoreModule::class, MyAppModule::class])
interface AppComponent {
...
}
我有以下Maven项目结构: i、 e.Project1、Project2和Project3在目录结构上是对等的,它们都是Spring Boot应用程序(JAR)。我想将Project2和Project3视为Project1的子项,而不改变目录结构。当我在父项目上执行相同的maven命令时,我需要在子项目上过渡地执行所有maven命令。而且最重要的是,我应该能够将它们打包到一个JAR文件中。我在谷
我设计了一个maven多模块项目,就像下面这个帖子的第一个答案:Multi-module maven with Spring Boot 现在我想要一个通用的maven模块,它可以包含一些供多个微服务使用的模型。如果我将这个公共项目作为第一级父pom的子项目(这样所有由引导注入的依赖项(如jpa、jackson等)都可用于公共项目),那么STS/Spring将它检测为引导应用程序,并抱怨maven
多模块项目具有具有以下依赖关系的模块:web- 我在web模块中添加了sping-boo-gradle-plugin: 当SpringBootGradle插件下载旧的hibernate版本时,我在持久性模块中有重复的版本。 形象 我尝试覆盖web模块中的hibernate依赖项,它正在工作: 形象 为什么插件下载旧的Hibernate版本?是否有任何可能排除旧的Hibernate版本从sping-
我在项目中有两个模块(和)运行集成测试。我希望在测试之前,我的应用程序将使用liquibase启动和滚动迁移,但由于我通过集成测试模块运行应用程序,liquibase正在寻找一个关于该模块的主文件,该文件导致了错误。因为主文件位于miom应用程序()的模块中
null 我们是否必须构建没有依赖项的jar,war,并让它们在生产机器上第一次引导时下载依赖项?还是单独的依赖包,这样在增量部署中,我们就不需要重新上传整个东西了吗? 问候, 更新1:
我已经找了很长时间的答案,但并没有运气,所以我决定张贴它。最近,我尝试用父pom制作一些简单的应用程序,以轻松管理我的依赖项版本。因此,我在我的父母pom中添加了依赖项,添加了第一个简单的依赖项,我得出了: 然后我做了第一个孩子项目: 我确实试着建造,但最终 现在我不明白为什么Spring Boot依赖项被正确地提取出来,但spring cloud不是,如果我将dependencymanageme