【问题标题】:Using of graphql service within desktop application that "follows" MVVM and DDD在“遵循”MVVM 和 DDD 的桌面应用程序中使用 graphql 服务
【发布时间】:2019-05-07 15:10:49
【问题描述】:

我们有一个使用 MVVM 模式和 DDD 的 WPF 桌面应用程序(好吧,假设至少我的模型类存储由取自现实世界的实体命名的数据)。 APP 通过 REST API 使用多个微服务。它工作得很好。直到我们认为是时候使用一些外观作为后端部分来联合所有这些微服务并仅获取特定屏幕所需的数据。


但是。问题是,如何让他们生活在一起。

  • 一方面,我们从graphql 动态返回数据。它
    意味着,例如,如果我们在一个屏幕上有人员列表, 我们将要求此人的 ID、姓名、姓氏和角色。在
    用于下拉人员的不同屏幕我们将请求相同的数据 但没有角色。
  • 另一方面,我们有一个 Person 类,它具有一组静态字段 Name、Surname、Role 和 Id,这是人在“现实生活”中所拥有的

如果我们将相同的 Person 类与 graphql 一起使用,将数据从 JSON 转换 到模型 Person,两个屏幕都可以正常工作,但在后台一个不需要角色的屏幕会'不要从 graphQL 请求它。我们会遇到这样一种情况,模型类 Person 将具有字段 Role 但它只是空的(我相信这是一种气味。至少我不觉得维护这样的代码很容易. 开发者需要在屏幕上添加一些信息,打开模型,看到角色在那里,将字段绑定到屏幕上去喝咖啡。然后哎呀,有字段但没有分配数据 )。


我想到的两种变体是:

  • 不使用模型和 DDD 并将数据直接映射到 ViewModel (个人感觉就像毁了我们之前的一切)。
  • 或者我们将动态数据映射到我们现有的模型和不同屏幕的不同字段(例如同一类 Person)将是 空的(因为没有请求)。

也许有人已经使用过这样的组合。你如何使用它,有什么优缺点?

【问题讨论】:

  • 您仍然可以将 DDD 值对象用于查询参数和响应字段。它适用于查询验证和构建/解析数据库查询。不过,DDD 实体更多的是关于突变而不是查询。查询(不仅仅是 GraphQL)更加多样化,虽然它们应该使用通用语言,但它仍然只是其中的一部分。

标签: wpf mvvm graphql domain-driven-design desktop-application


【解决方案1】:

这是一种相当常见的情况,您有一个数据层返回许多列,但在给定视图中只使用了一些列。

没有绝对的“最佳”解决方案与整套列对性能的影响程度无关。这可能又与缓存之类的东西相关联。

您可以编写返回数据子集的服务,然后只使用必要的带宽。一种 CQRS 模式,但可能有更多的模型,而不仅仅是读取 + 写入。

这通常是不必要的,并且引入的并发症并不能弥补增加的维护成本。

通常所做的只是从模型映射到视图模型(并返回)。只需要 4 列的视图模型只有 4 个属性,并且模型返回的任何属性都不会被复制。需要 5 个的视图模型有 5 个属性,它们是从模型中复制而来的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多