在清洁架构 MVVM 中,将 objects 转换为适配器?
In Clean architecture MVVM where transform objects to adapter?
所以,假设我有一个具有多种视图类型的适配器,我从服务器 api 收到的只是一个列表,我必须在我的适配器 objects.[=12= 中进行转换]
示例:
我有一个具有关联类型的人员列表,让我们想想 1 和 2,我想在我的回收视图中显示不同类型之间的 header。
所以,我有一个片段 - 视图模型 - 用例 - 存储库(请求 api)
我的适配器需要一份人员名单。
假设 Person 是一个接口,person1 和 person2 实现了它。
最后,我从服务器收到一个带有 objects PersonApi 的列表,它有一个类型作为参数,我必须将其转换为我的适配器 objects。
我应该在哪里做这个转换?
存储库?
用例?
查看模型?
我的猜测,应该是用例。
编辑:
添加了图表
根据 Clean 架构的基本规则,每一层都完全独立于其他层。所以这里你必须根据场景在模型 class 或视图模型 class 中编写业务逻辑,将此唯一属性值发布到视图(适配器)。请在下面找到高级架构图:
您可以创建一个映射器 class 来将您的用例中的数据和 return 域对象转换到您的视图中
more information and sample code
在 Use Case
层执行,所有情况下 ViewModel
不应更改来自 API 的任何数据,它只会将其发送到 view
。
在存储库中,您更改对域实体的响应,在 ViewModel 中,您将域实体更改为视图实体,其中域是控制您的行为的地方,例如您从 API 获取数据,并且然后出现在视图层中,你想为视图添加某些属性,你将域映射到视图,然后如果你想将内容存储在数据库中,你可以从视图映射到域,从域映射到数据库实体
让我们从这样一个事实开始:干净架构的完整实现有很多层、模型映射……这使得它很难实现。因此,我们可以利用简化版本,就像您在三层问题中提到的那样; Data
、Domain
和 Presentation
。
每一层都有特定的数据模型很好,但也可以与 Presentation
共享 Domain
个模型。这意味着您只需要一步数据映射,它发生在 Data
和 Domain
之间的邻接点。
由于存储库是 Data
和 Domain
之间的桥梁,因此它是映射模型的正确位置。
存储库的定义应该是 Domain
的一部分,并且在 Data
中实现。这样 Data
层就提供了 Domain
层所期望的。请记住 Domain
不得 知道 Data
层及其实现的任何内容。所以,如果你在不同的 gradle 模块中实现你的层,你应该在 Data
模块内依赖于 Domain
,而不是相反。
类 的简化实现可能如下所示:
域:
interface Person
class Person1() : Person
class Person2() : Person
interface PersonRepository {
fun getPersons(): List<Person>
}
class GetPersonsUseCase(val repository: PersonRepository) {
fun execute(): List<Person> {
return repository.getPersons()
}
}
数据:
class PersonRepositoryImpl(val service: PersonService): PersonRepository {
fun getPersons(): List<Person> {
val list: List<PersonEntity> = service.getPersons()
return list.map { it.toPerson() }
}
}
PersonEntity.toPerson(): Person {
return ... // create an instance of Person1 or Person2 based on requirements.
}
所以,假设我有一个具有多种视图类型的适配器,我从服务器 api 收到的只是一个列表,我必须在我的适配器 objects.[=12= 中进行转换]
示例: 我有一个具有关联类型的人员列表,让我们想想 1 和 2,我想在我的回收视图中显示不同类型之间的 header。
所以,我有一个片段 - 视图模型 - 用例 - 存储库(请求 api)
我的适配器需要一份人员名单。 假设 Person 是一个接口,person1 和 person2 实现了它。
最后,我从服务器收到一个带有 objects PersonApi 的列表,它有一个类型作为参数,我必须将其转换为我的适配器 objects。
我应该在哪里做这个转换? 存储库? 用例? 查看模型?
我的猜测,应该是用例。
编辑:
添加了图表
根据 Clean 架构的基本规则,每一层都完全独立于其他层。所以这里你必须根据场景在模型 class 或视图模型 class 中编写业务逻辑,将此唯一属性值发布到视图(适配器)。请在下面找到高级架构图:
您可以创建一个映射器 class 来将您的用例中的数据和 return 域对象转换到您的视图中 more information and sample code
在 Use Case
层执行,所有情况下 ViewModel
不应更改来自 API 的任何数据,它只会将其发送到 view
。
在存储库中,您更改对域实体的响应,在 ViewModel 中,您将域实体更改为视图实体,其中域是控制您的行为的地方,例如您从 API 获取数据,并且然后出现在视图层中,你想为视图添加某些属性,你将域映射到视图,然后如果你想将内容存储在数据库中,你可以从视图映射到域,从域映射到数据库实体
让我们从这样一个事实开始:干净架构的完整实现有很多层、模型映射……这使得它很难实现。因此,我们可以利用简化版本,就像您在三层问题中提到的那样; Data
、Domain
和 Presentation
。
每一层都有特定的数据模型很好,但也可以与 Presentation
共享 Domain
个模型。这意味着您只需要一步数据映射,它发生在 Data
和 Domain
之间的邻接点。
由于存储库是 Data
和 Domain
之间的桥梁,因此它是映射模型的正确位置。
存储库的定义应该是 Domain
的一部分,并且在 Data
中实现。这样 Data
层就提供了 Domain
层所期望的。请记住 Domain
不得 知道 Data
层及其实现的任何内容。所以,如果你在不同的 gradle 模块中实现你的层,你应该在 Data
模块内依赖于 Domain
,而不是相反。
类 的简化实现可能如下所示:
域:
interface Person
class Person1() : Person
class Person2() : Person
interface PersonRepository {
fun getPersons(): List<Person>
}
class GetPersonsUseCase(val repository: PersonRepository) {
fun execute(): List<Person> {
return repository.getPersons()
}
}
数据:
class PersonRepositoryImpl(val service: PersonService): PersonRepository {
fun getPersons(): List<Person> {
val list: List<PersonEntity> = service.getPersons()
return list.map { it.toPerson() }
}
}
PersonEntity.toPerson(): Person {
return ... // create an instance of Person1 or Person2 based on requirements.
}