在哪里转换 WebService 的结果,在 Repository 或 ViewModel 中?

Where to transform a result of WebService, in Repository or ViewModel?

我的应用程序架构如下:View -> ViewModel -> Repository -> Datasource

我的 DataSource 正在使用一个网络服务,然后接收一个 Soap 对象,我想将其转换为自定义 Pojo 对象。因此,通过使用 RxJava 我按照以下流程调用 DataSource 方法:

ViewModel

    repository.webserviceCall(data)...
            .subscribe();

存储库

public Single<SoapObject> webserviceCall(String data) {
    return dataSource.webserviceCall(data);
}

数据源

public Single<SoapObject> webserviceCall(String data) {
    WSSoapDAO soapDAO = new WSSoapDAO("webserviceMethodName");
    soapDAO.addProperty("data", data);
    return soapDAO.call();
}

然后我想知道我应该在哪里转换在 DataSource 调用中收到的 SoapObject,或者在 Repository class,在 ViewModel class 或 DataSource class本身?

就您的体系结构而言,我认为转换应该转到存储库。让我们调用要进行转换的实体 Mapper。映射器应该将 DTO 对象 SoapObject 转换为模型对象 PojoObject.

例如

public interface Mapper {
    public PojoObject map(SoapObject dto)
}

现在表示层(ViewViewModel)对 Datasources[= 公开的 DTO 对象一无所知24=].

除了 Onik 的回答之外,我还想用一些东西来扩展它。

  1. 这接近基于观点的事实,所以走路时要小心。 :)

  2. 我同意这通常是存储库问题(有一个“但是”)。一般来说,如果您从远程服务接收的数据需要转换,那么您希望将其从所述数据的 消费者 中抽象出来(一个 ViewModel,甚至是您的本地数据库)。

  3. 如果数据要不同地转换以用于不同的用途,那么您可能需要重新考虑您的架构(或者更确切地说,您的远程服务! );在任何情况下,为了视图的目的,viewModel 应该只做(在我看来)与将您的本地域 objects/models/entities 修改为不同的东西相关的事情 需要它。换句话说,如果一个特定的“屏幕”需要转换数据(例如,将几个模型展平成一个 List<Things> 以简化 Recyclerview,那么它可能属于 ViewModel,假设您注入一个“映射器” " object (transformer, mapper, whateverDelegate, youNameIt) 所以 ViewModel 委托 这个转换(因此简化了测试)。

  4. 无论如何,请记住这是非常基于意见的,并且是特定领域的,但最终,您需要一个干净的存储库来为您提供数据,以及您不提供的数据每次都想思考(或知道)它的来源,而不是你关心的格式。

架构设计基于视点。它并不总是最适合你的。

Repository modules handle data operations. They provide a clean API so that the rest of the app can retrieve this data easily. They know where to get the data from and what API calls to make when data is updated. You can consider repositories to be mediators between different data sources, such as persistent models, web services, and caches.

这是Google对存储库作用的看法:从不同的数据源查询数据并组合它们,然后使它们可供不同的组件使用。

有一个简单的思考方式:不同的视图、活动、服务是否需要相同格式的数据?

  • 如果是,则为通用数据,应在存储库中生成。
  • 如果不是,则为特定于视图的数据。它应该在视图模型中转换。
  • 如果这个数据只被一个组件使用,那么转换到哪里都可以。
    即使不需要做那么多抽象层,您也可以将数据源视为存储库。抽象只是用来解决复杂的问题。