Я должен использовать DTOs в качестве своих моделей данных в MVVM?

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

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

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

Я не нашел слишком много информации об этом подходе в моем чтении, таким образом, я хотел бы знать, является ли это довольно стандартной вещью, это, как просто предполагается, фактический способ сделать MVVM в многоуровневой среде? Если бы у меня есть полностью неверное представление о вещах затем, мысли о других подходах ценились бы также.

11
задан JonC 27 April 2010 в 10:21
поделиться

3 ответа

Я в этом не разбираюсь. У меня был точно такой же сценарий. Я согласен с вами, что это перебор. Я использую это решение уже довольно давно и не столкнулся с какими-либо проблемами. INotifyPropertyChanged для меня не представляет большой проблемы, поскольку ничто на стороне сервера не будет подписываться на событие PropertyChanged. Если вы будете использовать наследование в своих моделях данных, все они должны быть сериализуемыми. В моем сценарии у меня есть два базовых класса для моих моделей данных: один используется для передачи данных, а другой нет.

2
ответ дан 3 December 2019 в 10:43
поделиться

Я решил использовать свойство "Модель" в моей ViewModel. В самой модели я уже реализовал IPropertyNotifyChanged и IDataErrorInfo. Таким образом, в моей ViewModel я пропускаю свойства, в которых код просто «просачивается» в модель. Вместо этого View привязывается непосредственно к модели для этих свойств.

Для более сложных случаев, когда мне нужно настроить данные в модели, чтобы они соответствовали представлению, я делаю это в ViewModel. Кроме того, команды и т. Д. Находятся во ViewModel. Но я не вижу причин иметь шаблонный код в ViewModel, повторяющий то же самое, что у меня уже есть в модели.

1
ответ дан 3 December 2019 в 10:43
поделиться

Вы можете использовать любую модель, с которой вам удобно, да, все ваши свойства будут нуждаться в поведении INotifyPropertyChanged. Как это повлияет на уровень обслуживания, полностью зависит от вашей реализации.

Я предполагаю, что вы думаете, что привязываетесь к своим DTO в вашем представлении?

Как я вижу, существует несоответствие импеданса между уровнями приложения, то есть вашего домена Модель, вероятно, похожа на вашу реляционную модель с небольшими, но важными отличиями.Также существует несоответствие между моделью предметной области и вашим DTO (объекты могут быть сглаженными, вычисленные свойства и т. Д., ...). Заманчиво связываться напрямую с DTO, поскольку они, вероятно, предназначены для того, чтобы иметь то, что вам нужно для конкретной операции, однако существует также несоответствие импеданса между DTO и тем, что необходимо представлению для достижения желаемого результата. Здесь на помощь приходит модель представления. Модель представления отвечает за проксирование свойств DTO в представление, она отвечает за то, чтобы представление узнало, есть ли ошибки проверки, и направляет команды соответствующему обработчику (Сохранить, Удалить и т. Д. , ...).

Я обычно настраиваю вещи следующим образом:

// POCO object. Serializable.
public class AddressDto 
{    
   public int Id { get; set; }
   public string Street { get; set; }    
   public string City { get; set; }    
   public string Country { get; set; } 
}

// IDataErrorInfo for validation.
public class AddressViewModel : INotifyPropertyChanged, IDataErrorInfo
{
   private readonly AddressDto addressDto;

   public AddressViewModel(AddressDto addressDto)
   {
      this.addressDto = addressDto;      
   }

   public int Id { /* get and set for property changed event and update dto */ }
   public string Street { /* get and set for property changed event and update dto  */ }
   public string City { /* get and set for property changed event and update dto  */ }
   public string Country { /* get and set for property changed event and update dto  */ }
   ...

   // IDataErrorInfo implementation
}

public class EditAddressViewModel : INotifyPropertyChanged
{
   public AddressViewModel Address { /* get and set for property changed event */ }
   public ICommand Save { /* setup command */ }
   public ICommand Cancel { /* setup command */ }

   private void Save()
   {
   }

   private void Cancel()
   {
   }
}

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

Да, это означает дополнительную работу, но есть вещи, которые вы можете немного упростить (генерация кода и т. Д.). На самом деле я работаю над библиотекой, которая направлена ​​на упрощение всего процесса MVVM с использованием свободного API. Проверьте это на http://fluentviewmodel.codeplex.com/

5
ответ дан 3 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: