如何使用Android的Dagger2提供Room Dao依赖关系?

问题描述 投票:0回答:1

我的存储库传递了一个Room Persistence lib。 o对象为依赖项。问题是Dao是一个接口。 Google的最新建议是执行以下操作:

// Tells Dagger this is a Dagger module
// Because of @Binds, StorageModule needs to be an abstract class
@Module
abstract class StorageModule {

    // Makes Dagger provide SharedPreferencesStorage when a Storage type is requested
    @Binds
    abstract fun provideStorage(storage: SharedPreferencesStorage): Storage
}

在上面的示例中,SharedPreferencesStorage是用户创建的接口Storage的实现。 Room dao依赖项的问题在于,该实现是由roomDatabase.getDatabase(context).myDao()之类的库生成的。最新的Dagger版本似乎避免使用通过模块构造函数传递组件依赖项的旧方法。是否可以使用@Subcomponent.Factory@Component.Factory来执行此操作,或者“旧”方法是对Room dao依赖项进行此操作的唯一方法?

android android-room dagger-2
1个回答
0
投票

您可以尝试以下方法:

@Module
class DatabaseModule {
    @Provides
    fun provideDaoA(db: MyDb): DaoA = db.daoA()

    @Provides
    fun provideDaoB(db: MyDb): DaoB = db.daoB()
}

class MyRepository @Inject constructor(private val daoA: DaoA) {..}

另一种方法from googlesamples

    @JvmStatic
    @Singleton
    @TasksLocalDataSource
    @Provides
    fun provideTasksLocalDataSource(
        database: ToDoDatabase,
        ioDispatcher: CoroutineDispatcher
    ): TasksDataSource {
        return TasksLocalDataSource(
            database.taskDao(), ioDispatcher
        )
    }
© www.soinside.com 2019 - 2024. All rights reserved.