ViewModel 和 Entity 的区别

问题描述 投票:0回答:1

对此有点迷茫,求有经验有知识的朋友帮忙

  • 视图模型:我可以用来在 UI 端显示数据的对象
  • Entity:到数据库端,我可以进行后期操作的对象

到目前为止一切正常。我有一个这样的场景:我有一个 API 资源和一个可用的移动应用程序。在应用程序中,我将要显示在屏幕上的数据投影到屏幕上,方法是将其保存在视图模型对象中。

那么是否有必要通过视图模型对象通过API来满足未来的数据呢?或者创建实体对象并将从 API 接收的数据与该实体对象匹配并应用自动映射器查看模型对象是否正确?

另一个一直在我脑海中盘旋的问题如下:我将通过应用程序进行

POST
操作,要发布的对象应该是视图模型还是实体?

例如,正在发布用户名和密码。我需要将从屏幕获取的信息传输到视图模型对象并发布该对象,还是需要将其移动到实体对象并发布?

可能有点复杂,但我想以最好的方式表达自己。网上资源很多,说的都是一样的

我喜欢研究细节,谢谢。

我正在开发一个项目,我想以正确的方式进行。一个困扰我的问题,请大家支持

c# model-view-controller mvvm viewmodel
1个回答
0
投票

好的,我会尝试帮助您简化思考这些抽象的方式,这些抽象现在听起来让您感到困惑,但它非常简单:

ViewModel 是一个具有特定数据结构的对象,可用于您的 UI。根据 UI 技术/框架的不同,可能会有特定的逻辑和行为,它将充当通常可绑定的数据持有者。

实体是一个代表独立状态的对象,可能包含将根据应用程序的业务需求执行的数据和行为。

在大多数情况下,视图模型和实体看起来几乎相同,但让对象专注于其职责是一个很好的做法。

你缺少的是 DTO(数据传输对象)。这种对象是我们在从 API/External Layers 发出请求/获取响应时使用的。

当我们对服务器进行 API 调用时,我们会收到一个通常包含 JSON 数据的响应。然后我们必须处理这个响应,构建一个对象,映射这个对象(视图模型)的属性和值等等。为了调用和 API,通常我们从 Viewmodels 获取数据,将它们映射到 DTO,然后通过网络发送。

实体的角色是执行数据和行为,它们可能具有也可能不具有与 UI 模型或 DTO 相同的形状。

编辑:

假设我们有一个登录表单,显示用户名、密码输入和“保持登录状态”复选框。我们还有一个布尔标志,它会告诉我们表单是有效的,即当所有表单字段都填写了有效数据时为 True,否则为 False。登录按钮将根据此值启用或禁用,以防止不必要的登录尝试。最后,我们需要保存一条字符串消息,最终向用户显示错误文本。

所以这个登录表单的视图模型可以这样定义:


class LoginFormViewModel {

  username: string | null;
  password: string | null;
  persistentCookie: boolean = false;
  isValid: boolean = true;
  message: string | null;

}

注意此视图模型包含将绑定到 UI/表示逻辑和可视组件的数据。

当用户点击表单上的 SignIn/Login 按钮时,我们只从 viewmodel 中提取我们发出登录请求所需的内容。


class LoginRequestDto {

  username: string;
  password: string;
  persistCookie: boolean;

  constructor(username: string, password: string, pers: boolean) {
    this.username = username;
    this.password = password;
    this.persistCookie = pers;
  }

}

class LoginView {

  ctor(viewModel: LoginViewModel) {
    this.vm = viewModel;
  }

  onLoginClick() {
    this.doLogin();
  }

  async function doLogin() {
    var vm = this.vm;
    var requestDto = new LoginRequestDto(vm.username, vm.password, vm.persistentCookie);
  
    const result = await this.httpClient.Post('/login', requestDto);
    if (result.authenticated) {
      this.setState({
        isAuthenticated: true,
        //etc
      });
    }
  }
}

视图模型与视图的必要数据相关联,根据 API/端点的规范,DTO 将与正在发出的请求相关联,

© www.soinside.com 2019 - 2024. All rights reserved.