Я в настоящее время работаю над тем, что будет моим первым реальным набегом в использование MVVM и читало различные статьи о том, как лучше всего реализовать его.
Мои текущие мысли состоят в том, чтобы использовать мои модели данных эффективно, поскольку передача данных возражает, сделайте их сериализуемыми и сделайте, чтобы они существовали на обоих стороны клиента и сервера. Это походит на логический шаг, учитывая, что и типы объектов являются действительно просто наборами методов считывания свойства и методов set, и другой промежуточный слой походит на полное излишество.
Очевидно, были бы проблемы с INotifyPropertyChanged, не работающим правильно над стороной сервера, поскольку нет никакого ViewModel, с которым можно связаться, но, пока мы осторожны относительно построения наших надлежащих объектов модели предметной области от моделей данных на уровне служб и не контакте модели данных на стороне сервера, я не думаю, что это должна быть большая проблема.
Я не нашел слишком много информации об этом подходе в моем чтении, таким образом, я хотел бы знать, является ли это довольно стандартной вещью, это, как просто предполагается, фактический способ сделать MVVM в многоуровневой среде? Если бы у меня есть полностью неверное представление о вещах затем, мысли о других подходах ценились бы также.
Я в этом не разбираюсь. У меня был точно такой же сценарий. Я согласен с вами, что это перебор. Я использую это решение уже довольно давно и не столкнулся с какими-либо проблемами. INotifyPropertyChanged для меня не представляет большой проблемы, поскольку ничто на стороне сервера не будет подписываться на событие PropertyChanged. Если вы будете использовать наследование в своих моделях данных, все они должны быть сериализуемыми. В моем сценарии у меня есть два базовых класса для моих моделей данных: один используется для передачи данных, а другой нет.
Я решил использовать свойство "Модель" в моей ViewModel. В самой модели я уже реализовал IPropertyNotifyChanged и IDataErrorInfo. Таким образом, в моей ViewModel я пропускаю свойства, в которых код просто «просачивается» в модель. Вместо этого View привязывается непосредственно к модели для этих свойств.
Для более сложных случаев, когда мне нужно настроить данные в модели, чтобы они соответствовали представлению, я делаю это в ViewModel. Кроме того, команды и т. Д. Находятся во ViewModel. Но я не вижу причин иметь шаблонный код в ViewModel, повторяющий то же самое, что у меня уже есть в модели.
Вы можете использовать любую модель, с которой вам удобно, да, все ваши свойства будут нуждаться в поведении 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/