Как вы объединили преимущества прямого подхода View-to-Model и MVVM в ваших проектах WPF? - PullRequest
2 голосов
/ 22 октября 2009

В нашем приложении у нас есть множество моделей объектов, которые имеют сотни свойств.

Для каждого свойства модели :

public string SubscriptionKind { get; set; }
...100x...

нам нужно было создать свойство с поддержкой INotifyPropertyChanged в ViewModel :

#region ViewModelProperty: SubscriptionKind
private int _subscriptionKind;
public int SubscriptionKind
{
    get
    {
        return _subscriptionKind;
    }

    set
    {
        _subscriptionKind = value;
        OnPropertyChanged("SubscriptionKind");
    }
}
#endregion

...100x...

, что означало, что когда наше представление отправляло событие Сохранить , нам пришлось переназначить все эти значения модели представления обратно в модель:

customer.SubscriptionKind = this.SubscriptionKind
...100x...

Это стало утомительным и заняло много времени, так как модели продолжали меняться, и нам пришлось отобразить все изменения в ViewModels.

Через некоторое время мы поняли, что было бы проще просто подключить DataContext представления напрямую к модели, что позволяет нам связывать элементы XAML непосредственно со свойствами объекта Model, чтобы Событие save просто сохранит объект без какого-либо сопоставления.

Что мы потеряли в этом ходу:

  • возможность с помощью UpdateSourceTrigger=PropertyChanged выполнять детальную проверку и манипуляции в SetMerter свойств ViewModel, что мне очень понравилось: этого у нас больше нет, так как никаких изменений в XAML просто изменяет тупое свойство в Model

  • способность (в будущем) создавать фиктивных представлений , которые по-новому проверяют логику пользовательского интерфейса нашей модели представления, например, "если для свойства SubscriptionKind установлено значение" Ежегодно ", то (1) измените скидку на 10%, (2) запустите" анимацию поздравлений "и (3) сделайте кнопку заказа более заметной.

Оба этих подходов имеют очевидных преимуществ , например. первый подход «View-direct-to-Model», особенно в сочетании с LINQ-to-SQL , прагматичен и позволяет вам быстро создавать полезное программное обеспечение, если вы используете {Binding...} вместо x:Name у вас все еще есть возможность "передать свои взгляды в Blend Designer".

С другой стороны, хотя MVVM требует от вас поддерживать утомительное отображение модели на ViewModel, оно дает вам мощные проверки и тестирования преимуществ, которых не имеет первый подход.

Как вам удалось объединить преимущества этих двух подходов в ваших проектах?

Ответы [ 4 ]

1 голос
/ 27 октября 2009

Почему бы не использовать инструмент отображения, такой как AutoMapper ? Это быстро, и вам не нужно писать весь этот код отображения:

Mapper.CreateMap<MyModel, MyViewModel>();
MyViewModel vm = Mapper.Map(myModelInstance);

Действительно просто, и теперь вы получаете лучшее из обоих миров.

Automapper использует технику, которая генерирует сборки на лету, чтобы сделать отображение. Это заставляет его выполняться так же быстро, как если бы вы написали весь этот утомительный код отображения, но вам не нужно.

1 голос
/ 22 октября 2009

Поскольку у вашей ViewModel есть доступ к модели, вы также можете просто напрямую обернуть свойства модели:

#region ViewModelProperty: SubscriptionKindprivate
// int _subscriptionKind; - Use the model directly
public int SubscriptionKind
{
    get
    {
        return this.Model.SubscriptionKind;
    }
    set
    {
        if (this.Model.SubscriptionKind != value)
        {
            this.Model.SubscriptionKind = value;
            OnPropertyChanged("SubscriptionKind");
        }
    }
}
#endregion

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

0 голосов
/ 18 ноября 2009

Я использовал класс Генератора t4 для создания моих ViewModels из XAML, не уверен, поможет ли это вашей ситуации.

0 голосов
/ 22 октября 2009

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

Первое отображение (модель данных на модель бизнес-объекта) и создание свойств генерируются генератором кода.

...