Как правильно предоставить контекст для источника данных с чистой архитектурой, MVVM и Koin? - PullRequest
0 голосов
/ 04 мая 2020

Я разрабатываю приложение Android с Kotlin, в котором мне нужно узнать текущее местоположение мобильного устройства. Я уже нашел способ сделать это в различных примерах, но я не знаю, как интегрировать эти логи c в соответствии с Clean Architecture с MVVM.

В моей архитектуре у меня есть следующие уровни: Презентация, UseCase, Data, Domain и Framework. У меня есть уровень представления, организованный с помощью шаблона MVVM. Также я использую Koin для внедрения зависимостей.

Я получаю все данные, которые нужны моему приложению, из источников данных, находящихся на уровне Framework. Например, данные, полученные удаленно или из базы данных, или данные, предоставленные устройством (местоположение).

Вот пример файлов, участвующих в получении местоположения из ViewModel:

ConfigurationViewModel (уровень представления):

class ConfigurationViewModel(private val useCase: GetLocationUseCase) : ViewModel() {

    fun onSearchLocationButtonClicked() = liveData<Resource<Location>>(Dispatchers.IO) {
        emit(Resource.loading())
        try {
            emit(Resource.success(data = useCase.invoke(UseCase.None())))
        } catch (exception: Exception) {
            emit(Resource.error(message = exception.message))
        }
    }

GetLocationUseCase (уровень использования):

class GetLocationUseCase(private val locationRepository: LocationRepository) :
    UseCase<Location, UseCase.None>() {

    override suspend fun invoke(params: None): Location = locationRepository.getLocation()
}

LocationRepositoryImpl (уровень данных):

class LocationRepositoryImpl(private val locationDeviceDataSource: LocationDeviceDataSource) :
    LocationRepository {
    override suspend fun getLocation(): Location = locationDeviceDataSource.getLocation()
}

LocationDeviceDataSourceImpl (уровень структуры):

class LocationDeviceDataSourceImpl(private val context: Context) : LocationDeviceDataSource {

    override suspend fun getLocation(): Location =
        LocationServices.getFusedLocationProviderClient(context).lastLocation.await()
}

Как вы можете видеть, в LocationDeviceDataSourceImpl мне нужен контекст чтобы получить последнее местоположение. Я не знаю, как лучше всего предоставить контекст для источника данных. Я видел несколько примеров, но я хочу понять, как лучше всего это сделать.

Я видел следующие варианты:

  • Используйте AndroidViewModel, чтобы предоставить контекст приложения для UseCase, чтобы предоставить его в хранилище, чтобы, наконец, предоставить его в источник данных. Но я не уверен, является ли это подходящим способом, безопасен ли он и поддерживает ли он смысл архитектуры. Основано на ответе Алекса

  • Другой вариант, который я видел, - это вставить androidContext через Koin в DataSource, что является еще одним способом предоставления контекста применение. Таким образом, для контекста не требуется go через ViewModel, UseCase или репозиторий. Основано на ответе Маслика

Каким образом можно интегрировать этот лог c в соответствии с моей архитектурой и почему? Или эта проблема из-за моей архитектуры?

Большое спасибо за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...