android - 为具有 Clean Architecture、MVVM 和 Koin 的数据源提供上下文的正确方法是什么?
问题描述
我正在使用 Kotlin 开发一个 Android 应用程序,我需要在其中获取移动设备的当前位置。我已经在各种示例中找到了一种方法,但我不知道如何根据 Clean Architecture 与 MVVM 集成此逻辑。
在我的架构中,我有以下几层:Presentation、UseCase、Data、Domain 和 Framework。我用 MVVM 模式组织了表示层。我也使用 Koin 进行依赖注入。
我从框架层中的数据源获取我的应用程序需要的所有数据。例如,远程或从数据库获得的数据,或设备(位置)提供的数据。
以下是从 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中,我需要上下文来获取最后一个位置。我不知道向 DataSource 提供上下文的最佳方式是什么。我看过几个例子,但我想了解最好的方法是什么。
我看到了以下选项:
使用AndroidViewModel,将应用程序的上下文提供给UseCase,提供给Repository,最终提供给DataSource。但我不确定这是否是一种合适的方式,是否安全,是否保持建筑感。基于亚历克斯的回答
我看到的另一个选项是通过 Koin 将 androidContext 注入 DataSource,这是提供应用程序上下文的另一种方式。这样,上下文就不必通过 ViewModel、UseCase 或 Repository。基于maslick的回答
根据我的架构集成此逻辑的适当方法是什么?为什么?或者这个问题是因为我的架构?
非常感谢您的时间。
解决方案
推荐阅读
- angular - 在Angular中创建动态反应表单时无法将变量设置为FormControl名称
- iframe - 在 iFrame 下为 Safari 加载网页时 CSS 损坏
- github-pages - 将 master 分支中的更改推送到 gh-pages 分支
- android - Exoplyaer 不会将当前位置从服务返回到活动?
- database - 如何在 mongoDB 服务器上配置 SSL?
- hadoop - 将hdfs文件附加到本地文件?
- youtube-api - Youtube API - 视频类别 ID 可分配
- vue.js - vue.js 反应性不适用于对象数组
- c# - 如何通过 C# 代码将 file:/// 转换为正常路径,例如:S:/soft/abc/xy.txt
- oop - Lua 程序中的文件无法引用彼此的变量