【问题标题】:Is it possible to provide DAOs or Room database without Dagger Module是否可以在没有 Dagger 模块的情况下提供 DAO 或 Room 数据库
【发布时间】: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 将是一个选项。

标签: android android-room dagger-2 dagger dagger-hilt


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2018-09-21
    • 2013-08-21
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多