Как обеспечить зависимость Room Dao, используя Dagger2 для Android? - PullRequest
0 голосов
/ 08 апреля 2020

Мой репозиторий проходит в Комнате Постоянства lib. Дао объект как зависимость. Проблема в том, что Дао - это интерфейс. Самым последним предложением 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, или это «старый» способ сделать это только для комнатных дао-зависимостей?

1 Ответ

0 голосов
/ 09 апреля 2020

Вы можете попробовать следующий подход:

@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) {..}

Другой подход из googlesamples :

    @JvmStatic
    @Singleton
    @TasksLocalDataSource
    @Provides
    fun provideTasksLocalDataSource(
        database: ToDoDatabase,
        ioDispatcher: CoroutineDispatcher
    ): TasksDataSource {
        return TasksLocalDataSource(
            database.taskDao(), ioDispatcher
        )
    }
...