【问题标题】:Where to transform a result of WebService, in Repository or ViewModel?在 Repository 或 ViewModel 中,在哪里转换 WebService 的结果?
【发布时间】:2021-04-08 14:29:15
【问题描述】:

我有一个应用程序架构:View -> ViewModel -> Repository -> Datasource

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

视图模型

    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 类中,在ViewModel 类还是 DataSource 类本身?

【问题讨论】:

    标签: android mvvm rx-java transformation android-mvvm


    【解决方案1】:

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

    1. 这接近于基于意见的事实,所以要小心你走路的地方。 :)

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

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

    4. 在任何情况下,请记住这是非常基于意见和特定领域的,但最终,您需要一个干净的存储库,为您提供数据以及您不想考虑(或知道)的数据它来自哪里,除了你关心的格式,每次。

    【讨论】:

    • 非常感谢,我理解你的观点。
    【解决方案2】:

    就您的架构而言,我会说转换应该转到存储库。我们将要进行转换的实体称为Mapper。映射器应该将 DTO 对象 SoapObject 转换为模型对象 PojoObject

    例如

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

    现在表示层(ViewViewModel)对 Datasources 暴露的 DTO 对象一无所知。

    【讨论】:

    • 非常感谢,这个存储库调用不同的 WS 方法呢?接口中的“map”方法应该是负责检查来自什么方法然后决定如何转换的方法,还是应该在该接口中有不同的方法?
    • @mantc_sdr,在大多数情况下,每个存储库应该只调用一个数据源。按照这种方法,就您的架构而言,每个存储库应该只使用一个映射器。通过这样做,您将遵循 Separation-of-Concern 原则,使您的代码简洁。
    【解决方案3】:

    架构设计基于观点。它并不总是最适合您。

    存储库模块处理数据操作。它们提供了一个干净的 API,以便应用程序的其余部分可以轻松检索这些数据。他们知道从哪里获取数据以及在数据更新时调用什么 API。您可以将存储库视为不同数据源(例如持久模型、Web 服务和缓存)之间的中介。

    这是 Google 对存储库角色的看法:查询来自不同数据源的数据并将它们组合起来,然后将它们提供给不同的组件。

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 2011-03-01
      • 2019-08-04
      • 2011-06-11
      • 2018-02-14
      • 2011-07-27
      • 2015-08-12
      • 1970-01-01
      • 2014-12-29
      相关资源
      最近更新 更多