Проверка модели MVVM и привязка данных? - PullRequest
3 голосов
/ 09 июня 2011

При поиске руководств по передовым методам проверки свойств в WPF MVVM я вижу, что многие люди используют интерфейс IDataErrorInfo Мне было просто интересно, можно ли настроить автоматическую проверку, подобную той, которая используется в ASP .Net MVCиспользуя атрибуты?

Может кто-нибудь подсказать, какие лучшие практики для проверки моделей в MVVM?Должна ли валидация быть в классе базовой модели?или на вид модель класса?

Ответы [ 4 ]

3 голосов
/ 09 июня 2011

Silverlight имеет элемент управления, называемый DataForm, который работает с использованием атрибутов DataAnnotations, и кто-то был достаточно любезен, чтобы перенес этот элемент управления в WPF .Я считаю, что это что-то вроде того, что вы ищете.

2 голосов
/ 09 июня 2011

Это хорошие вопросы !! Валидация принадлежит ОБА Модель и ViewModel (ы). Вот как я обычно к нему подхожу:

Сначала я добавлю в модель столько проверки, сколько смогу - это будут правила, которые не зависят от конкретной презентации. Например, предположим, что сотрудник в вашем домене недействителен, если у него нет свойства EmployeeNumber, которое не равно нулю, и шесть символов в длину, и каждый из шести символов должен быть цифрой.

Во-вторых, у меня есть базовый класс ViewModel, который реализует IDataErrorInfo. В этом базовом классе я в основном спрашиваю Модель, является ли она действительной, вызывая ошибку, если это не так (что легко перевести в представление с помощью IDataErrorInfo). Я также делаю методы реализации информации IDataError виртуальными, потому что ...

Наконец, будут крайние случаи, уникальные для данной презентации, которые не могут быть зафиксированы моделью. Для (надуманного) примера предположим, что у вас есть одна презентация, в которой сотрудник действителен, если введены только его имя и фамилия, и другая, для которой также требуется средний инициал. Хотя вы, безусловно, можете и должны иметь свойство компонента FullName / valueObject в Employee для проверки того, что это свойство не равно NULL, для каждой презентации необходим подкласс ViewModel, чтобы узнать, действительны ли в этом случае записи пользователя для свойств Fullame.

Наконец, вы можете и должны использовать Validator для проверки вашей Модели - мне нравится NHibernateValidator, но, безусловно, есть и другие (очень) хорошие. Большинство из них, включая NHibernate, будут поддерживать проверку атрибутов, которую вы ищете. Однако я предпочитаю более чистую альтернативу атрибутам, в результате чего я устанавливаю все правила валидации для своего валидатора в отдельном проекте (т.е. MyDomainImpl). Более чистый в смысле меньшего шума в модели и более четкого разделения проблем.

Не стесняйтесь задавать вопросы, если вам нужно. Также дайте себе время поработать над этим, пока у вас не появится подход, который работает для вас - это , а не тривиальная тема.

НТН,
Berryl

1 голос
/ 10 июня 2011

Где разместить логику проверки?

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

ссылка

.

Вымогут быть заинтересованы в примерах приложений WPF Application Framework (WAF) .Они показывают, как использовать атрибуты проверки .NET DataAnnotations вместе с шаблоном MVVM.

1 голос
/ 09 июня 2011

Я считаю, что проверка должна быть в ViewModel, а не в Model, потому что:

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

Если вы используете какой-либо инструмент внедрения зависимостей для своего приложения, например Unity, Windsor Castle и т. Д., Вы можете использовать перехватчики для проверки ViewModels. Перехватчики вызываются в первую очередь перед любым вызовом методов ViewModel.

Пример использования перехватчика с замком можно найти здесь - http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...