Имея очень мало опыта в этой области, я пишу приложение смарт-клиента WPF, общающееся с бэкэндом WCF с использованием MVVM, и я действительно пытаюсь принять правильные решения из всей информации. Это приводит меня к набору вопросов, которые, я надеюсь, могут быть решены здесь людьми, более опытными в этой области.
В качестве примера один из экранов позволит ввести порядок и добавить строки заказа в порядок.
Что используется в качестве модели?
В службе WCF у меня есть следующий упрощенный DTO:
public OrderDTO
{
string orderDetails { get; set; }
List<OrderLineDTO> OrderLines { get; set; }
}
public OrderLineDTO
{
int customerId { get; set; }
int productId { get; set; }
double quantity { get; set; }
}
И служба WCF, которая имеет следующий метод:
public OrderService Order
{
CreateOrderResponse CreateOrder(OrderDTO order)
}
В моем интеллектуальном клиенте WPF у меня есть ссылка на DTO, но, очевидно, он не реализует INotifyPropertyChanged
, поскольку он предназначен исключительно для транспорта.
Вопросы
Будет ли рекомендованный подход преобразовать эти DTO в модель, которая реализует INotifyPropertyChanged
с помощью Automapper или аналогичного? Или должен ли DTO использоваться в качестве модели непосредственно в ViewModel?
Общение между моделями просмотров
В настоящее время у меня есть вид заказа с 2 вкладками (Order
и OrderLines
) с ViewModels OrderViewModel
и OrderLineViewModel
. На вкладке заказа у меня есть ComboBox
содержащий идентификаторы и имена клиентов. Когда я выбираю клиента в OrderView
, мне нужно сообщить OrderLineView
, что клиент был выбран так, чтобы ComboBox
показывал только продукты, принадлежащие этому клиенту.
Вопросы
Как OrderViewModel
связывается с OrderLineViewModel
в этом сценарии?
Добавление строки заказа и применение логических/бизнес-правил
В качестве приложения уровня сервера будут использоваться несколько клиентов, например, ПК, мобильные устройства. Я хотел бы убедиться, что все бизнес-правила применяются в приложении уровня сервера. Например, когда добавляется строка заказа. если он относится к определенному типу продукта, он может быть добавлен только в том случае, если у клиента есть определенная сертификация.
Однако все, что я прочитал о MVVM, гласит, что модель - это то, что применяет бизнес-правила и поведение - все эти примеры реализовали модель на стороне клиента. В идеале, я не хочу дублировать те же проверки как на клиенте, так и на сервере, поэтому мне было интересно, как можно добиться того, чтобы этого не произошло.
Вопросы
Вы разрешаете пользователю добавлять строку недействительный, отправлять запрос на сервер, разрешать серверу применять соответствующие правила и возвращать ответ? Или вы каким-то образом применяете логику в смарт-клиентском приложении перед отправкой запроса на сервер?
Я действительно хочу поправиться во всех областях, которые я здесь изложил, и заблаговременно благодарю вас за любые ответы.
Спасибо
Алекс
Edit: Спасибо всем за ваш вклад, поскольку он помог мне стать более понятным с точки зрения лучшего пути вперед. Все ответы были хорошими, но я решил принять ответ Ури, поскольку он лучше всего подходит моим мыслям на этом этапе. Тем не менее, я по-прежнему не уверен в том, что лучше всего обработать преобразование из идентификатора DTO в SelectedItem в ItemsSource, который является списком ViewModels. Я вижу, что конвертер может работать, но я попытаюсь найти другое решение. Спасибо Алекс