在清洁架构 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 获取数据,并且然后出现在视图层中,你想为视图添加某些属性,你将域映射到视图,然后如果你想将内容存储在数据库中,你可以从视图映射到域,从域映射到数据库实体

让我们从这样一个事实开始:干净架构的完整实现有很多层、模型映射……这使得它很难实现。因此,我们可以利用简化版本,就像您在三层问题中提到的那样; DataDomainPresentation

每一层都有特定的数据模型很好,但也可以与 Presentation 共享 Domain 个模型。这意味着您只需要一步数据映射,它发生在 DataDomain 之间的邻接点。 由于存储库是 DataDomain 之间的桥梁,因此它是映射模型的正确位置。

存储库的定义应该是 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.
}