是否可以在没有 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 持久性库定义数据库以提供其Dao
s。
@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-我们是不是应该为每个活动/片段创建每个组件和模块
错误:[Dagger/MissingBinding] Map<Class<?扩展 ViewModel>, Provider<ViewModel>> 不能在没有 @P