Есть ли причина использовать ViewModel на серверной стороне Blazor?C#

Место общения программистов C#
Ответить
Anonymous
 Есть ли причина использовать ViewModel на серверной стороне Blazor?

Сообщение Anonymous »

Я начинаю разработку серверного приложения Blazor, и моя идея состоит в том, чтобы использовать: Структура моих папок будет выглядеть следующим образом:

Код: Выделить всё

Features
Feature 1
XXXView.razor : the view
XXXView.razor.cs : the partial class
XXXView.razor.queries.cs : contains the queries (ex : GetCustomer) used by the view
XXXView.razor.commands.cs : contains the commands (ex : SaveCustomer) used by the view
Feature 2
Мой вопрос следующий: есть ли в такой архитектуре веская причина использовать ViewModel (как в проектах asp .net MVC) вместо использования объекта непосредственно в представлении?
Приведенный ниже код является примером того, что я бы сделал без использования ViewModel.

Код: Выделить всё

public partial class UserEditView : EditableComponentBase
{
[Parameter]
public long? Id { get; set; }

[Required]
public string Name { get; set; }

protected override async Task OnInitializedAsync()
{
if (this.Id.HasValue)
{
UserEntity user = await Mediator.Send(new GetUserQuery(this.Id.Value));
this.Name = user.Name;
this.Title = $"Change info of {user.Name}";
}
else
{
this.Title = "New user";
}

await base.OnInitializedAsync();
}

protected override async Task Save()
{
UserEntity user = this.Id.HasValue ? await Mediator.Send(new GetUserEditViewQuery(this.Id.Value)) : new UserEntity();
user.Nom = this.Name;

await Mediator.Send(new SaveUserCommand(user));

Close();
}
}
с GetUserEditViewQuery, возвращающим объект со всей необходимой информацией, полученной или отложенной загрузкой.
Приведенный ниже код представляет собой пример того, что я буду делать, если буду использовать ViewModel.

Код: Выделить всё

 public partial class UserEditView : EditableComponentBase
{
[Parameter]
public long? Id { get; set; }

public UserViewModel User { get; set;  } = new UserViewModel();

protected override async Task OnInitializedAsync()
{
if (this.Id.HasValue)
{
this.User = await Mediator.Send(new GetUserEditViewQuery(this.Id.Value));
this.Title = $"Change info of {this.User.Name}";
}
else
{
this.Title = "New user";
}

await base.OnInitializedAsync();
}

protected override async Task Save()
{
await Mediator.Send(new SaveUserCommand(user));

Close();
}
}
с GetUserEditViewQuery, возвращающим ViewModel, содержащую всю необходимую информацию.
Как видите, разница, если бы я не использовал ViewModel, заключалась в том, что представление:
  • само определяло поля, которые будут отображаться (без использования ViewModel)
  • получило данные с помощью запроса, который возвращает здесь объект (но который может возвращать что-то еще, если необходимо) затем используйте его для установки переменных.
  • преобразуйте переменные в сущность (или другой объект, если необходимо) и вызовите команду для сохранения информации.
    => это очень похоже на то, как я разрабатываю настольное приложение.
Мне были бы интересны плюсы и минусы каждого подхода.
ОБНОВЛЕНИЕ
@Henk Holterman: я меняю GetUserQuery из примера 2 от GetUserEditViewQuery
@Ben Sampica: Во-первых, спасибо за ваш ответ.
Если я вас правильно понял,
В случае использования «Изменение информации о пользователе» ViewModel (UserEditViewModel) будет содержать всю информацию, необходимую для редактирования пользователя.
В случае использования «Просмотр информации о пользователе» ViewModel (UserViewViewModel: не очень приятно, но...) будет содержать всю информацию, необходимую для просмотра пользователя (которая может отличаться от страницы изменения).
=> запросы разные и поэтому возвращают разные модели представления.
Я понял, и это имеет смысл.
Но существует ли только одна модель представления на странице или я могу использовать более одной?
Действительно, в некоторых случаях страницы содержат список с кнопкой, которая позволяет пользователю добавить элемент в этот список.
/>Для меня добавление элемента в список вызывает новый запрос, который добавляет элемент в базу данных, а затем список обновляется.
Во многих примерах я вижу, как люди создают свойство в ViewModel страницы (скажем, UserEditViewModel) и заполняют его в основном запросе (скажем, GetUserEditViewQuery), что здесь на самом деле невозможно.
Если бы мне пришлось это сделать, я бы обязательно сделал что-то вроде этого:

Код: Выделить всё

this.List = await Mediator.Send(new GetListForUserEditViewQuery());
this.User = await Mediator.Send(new GetUserEditViewQuery());
Было бы это правильно?

Подробнее здесь: https://stackoverflow.com/questions/658 ... erver-side
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»