Ответ
Интерфейс репозитория обычно располагается в domain/data слое приложения (по принципам Clean Architecture). Он определяет контракт для работы с данными, абстрагируя источник данных (локальная БД, сеть и т.д.).
Пример:
// domain/repository/UserRepository.kt
interface UserRepository {
suspend fun getUser(id: String): User
suspend fun saveUser(user: User)
}
Реализация интерфейса будет в data слое:
// data/repository/UserRepositoryImpl.kt
class UserRepositoryImpl(
private val localDataSource: UserLocalDataSource,
private val remoteDataSource: UserRemoteDataSource
) : UserRepository {
// реализация методов
}
Такой подход позволяет легко менять источники данных и соблюдать Dependency Inversion Principle.