是否可以在没有 Dagger 模块的情况下提供 DAO 或 Room 数据库

Posted

技术标签:

【中文标题】是否可以在没有 Dagger 模块的情况下提供 DAO 或 Room 数据库【英文标题】:Is it possible to provide DAOs or Room database without Dagger Module 【发布时间】:2021-11-30 09:47:03 【问题描述】:

Room 持久性库定义数据库以提供其Daos。

@Database(...)
abstract class DbImpl : RoomDatabase() 

    abstract val daoImpl: DaoImpl

如何在 Dagger 中提供所有 DAO,而无需手动提供 Module

@Provides
fun provideDaoImpl(
    db: DbImpl,
) = db.daoImpl

【问题讨论】:

如果您已经提供了数据库,为什么不在 DbImpl 中创建抽象函数并使用您的数据库对象调用它们 对于数据库,您必须告诉 dagger 如何提供它,因为您不拥有该类 我提供DbImpl,但我不想单独提供所有DAO。另外我试图不直接依赖DbImpl。否则db.daoImpl 将是一个选项。 【参考方案1】:

您可以将 Room 数据库声明为组件依赖项,从而隐式提供任何已声明的 DAO。

这种方法的好处是您节省了一些样板文件,因为您不需要包装每个 DAO 的 @Provides 方法。缺点是 Room 数据库现在需要与您的组件一起创建,以将其链接为依赖项,这可能会导致 在应用启动时进行不必要的工作

我会坚持使用@Provides 方法和样板模块。希望您的 DAO 不会更改太多,这将难以维护,并且它使您能够在需要时懒惰地创建数据库。只需确保避免限定 DAO 包装器方法的范围,因为 Room 已经进行了一些内部双重锁定。

【讨论】:

以上是关于是否可以在没有 Dagger 模块的情况下提供 DAO 或 Room 数据库的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin + Dagger2:不能在没有 @Inject 构造函数或 @Provides- 或 @Produces-annotated 方法的情况下提供

Dagger 2,在模块中提供应用程序上下文

Dagger-我们是不是应该为每个活动/片段创建每个组件和模块

错误:[Dagger/MissingBinding] Map<Class<?扩展 ViewModel>, Provider<ViewModel>> 不能在没有 @P

Hilt 在 android 库中使用

Dagger 2 Activity 上下文/ApplicationContext 模块