Разница между ViewModel и Entity

Я немного в замешательстве по этому поводу, прошу помощи у опытных и знающих друзей.

  • Модель представления: объект, который я могу использовать для отображения данных на стороне пользовательского интерфейса.
  • Сущность: перейти на сторону базы данных, объект, где я могу выполнять почтовые операции

Пока все в порядке. У меня такой сценарий: у меня есть ресурс API и мобильное приложение. В приложении я проецирую данные, которые буду показывать на экране, на экран, удерживая их в объектах модели представления.

Так нужно ли встречать будущие данные по API через объекты модели представления? Или правильно создать объект-сущность и сопоставить данные, полученные от API, с этим объектом-сущностью и применить автомаппер для просмотра объектов модели?

Еще один вопрос, который крутится в моей голове, заключается в следующем: я сделаю POST операцию приложением, должен ли размещаемый объект быть моделью представления или сущностью?

Например, логин и пароль публикуются. Нужно ли мне передавать информацию, которую я получаю с экрана, в объект модели представления и публиковать этот объект, или мне нужно переместить ее в объект сущности и публиковать это?

Возможно, это было немного сложно, но я хотел выразить себя наилучшим образом. В интернете много ресурсов, и все они говорят одно и то же.

Мне нравится исследовать мелкие детали, спасибо.

Я разрабатываю проект и хочу сделать его правильно. Прошу поддержки в волнующем меня вопросе.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, я попытаюсь помочь вам упростить представление об этих абстракциях, которые сейчас кажутся вам запутанными, но это довольно просто:

ViewModel — это объект, который имеет определенную структуру данных, которая будет доступна вашему пользовательскому интерфейсу. В зависимости от того, что такое технология/фреймворк пользовательского интерфейса, он может иметь определенную логику и поведение, он будет действовать как держатель данных, обычно привязываемый.

Сущность — это объект, который будет представлять автономное состояние, может содержать данные и поведение, которые будут выполняться в соответствии с бизнес-требованиями вашего приложения.

В большинстве случаев модели представления и сущности будут выглядеть почти одинаково, но рекомендуется сосредоточить объекты на своих обязанностях.

Чего вам не хватает, так это DTO (объект передачи данных). Этот тип объекта мы используем при отправке запросов/получении ответов от API/внешних уровней.

Когда мы делаем вызов API на сервер, мы получаем ответ, который обычно содержит данные JSON. Затем мы должны обработать этот ответ, построить объект, сопоставить свойства и значения этого объекта (модель представления) и так далее. Для вызова и API мы обычно берем данные из Viewmodels, сопоставляем их с DTO и отправляем по сети.

Роль объекта заключается в обеспечении данных и поведения, которые могут иметь или не иметь ту же форму, что и модели пользовательского интерфейса или DTO.

Обновлено:

Предположим, у нас есть форма входа, в которой представлены входные данные для имени пользователя, пароля и флажок «Оставаться в системе». У нас также есть логический флаг, который сообщает нам, что форма действительна, т. Е. Истина, когда все поля формы заполнены действительными данными, в противном случае — ложь. Кнопка «Вход» будет включена или отключена в зависимости от этого значения, предотвращая ненужные попытки входа в систему. Наконец, нам нужно сохранить строковое сообщение, которое в конечном итоге покажет пользователю текст ошибки.

Таким образом, модель представления для этой формы входа может быть определена следующим образом:


class LoginFormViewModel {

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

}

Обратите внимание на эту модель представления, содержащую данные, которые будут привязаны к логике пользовательского интерфейса/представления и визуальным компонентам.

Когда пользователь нажимает кнопку «Войти/Войти» в форме, мы извлекаем из модели представления только то, что нам нужно, чтобы сделать наш запрос на вход.


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
      });
    }
  }
}

Модель представления привязана к необходимым данным для представления, DTO будут привязаны к выполняемому запросу в соответствии со спецификациями API/конечной точки,

Обновлено еще раз:

LoginView представляет собой некоторую форму входа, которая предоставляет визуальные компоненты, с которыми пользователь может взаимодействовать. Он содержит только код, который имеет дело с визуальной обратной связью. Для лучшей организации кода в представлении используется другой класс с именем LoginViewModel, который будет хранить состояние данных в контексте представления. Представление отражает данные из модели представления, а модель представления принимает входные данные из представления в двусторонней привязке данных. Затем мы можем создать еще один модуль в наших приложениях, например LoginService, который будет обрабатывать действия, которые нам нужно будет запускать из представления. Таким образом, поток данных: View, ViewModel, Service или Business Layer (LoginService), затем LoginRequestDto передается на уровень инфраструктуры, который отправит наш объект на цель. После этого мы можем получить ответ. Мы получаем эти данные, создаем LoginResponseDto и возвращаем их на наш сервисный/бизнес-уровень. Затем мы можем принимать решения, основанные на бизнес-логике, что делать дальше (успешный вход в систему или нет), перенаправлять на другое представление/страницу, представлять сообщение пользователю и т. д.

Хм, я понял, поэтому я должен хранить данные, поступающие от API, в объект сущности и сопоставлять сущность с моделью представления, чтобы отображать эти данные. Хорошо, я должен также отправлять данные, поступающие на экран с сущностью, когда я встречаю их с моделью представления и публикую их в API?

Kemal 16.04.2023 17:24

На самом деле вы должны использовать класс Model для хранения данных, ViewModel обычно отвечает за бизнес-логику. В MVVM, когда у вас также есть DTO (объекты передачи данных, которые представляют ваши сущности), вы должны сопоставить их с моделью, чтобы ваша ViewModel не знала, откуда поступают данные.

Julian 16.04.2023 18:52

Несколько лет назад я работал с паттерном MVVM, Caliburn.Micro, Durandal и т. д. MVVM не про бизнес-логику, а про VIEW LOGIC, поэтому он называется VIEW-MODEL. Вы помещаете туда логику для представления/ввода/вывода данных/оркестрации/потока. Бизнес-логика — это другое, и вы не должны смешивать бизнес-логику с логикой представления.

Jone Polvora 16.04.2023 18:58

@Kemal Я отредактировал свой ответ, добавив больше улучшений.

Jone Polvora 16.04.2023 18:59

Было очень приятно, что вы показали это на примере, спасибо. Я использовал DTO в своем приложении API, объединяя более одного объекта, кроме сущности, поэтому я объединил таблицы «Продукт» и «Категория» и использовал «ProductDetailsDTO». Но теперь я вижу в вашем коде, что у вас есть уникальный объект. Действительно ли «LoginRequestDTO» является шаблоном? и «LoginFormViewModel» напрямую обрабатывает данные из API? Или Модель должна соответствовать данным, поступающим из API?

Kemal 16.04.2023 22:52

Я попытаюсь проиллюстрировать обзор архитектуры, который делает большинство людей.

Jone Polvora 17.04.2023 01:12

Другие вопросы по теме