Где я должен выполнить проверку, чтобы увидеть, существует ли уже значение в базе данных при выполнении проверки в MVVM с использованием IDataErrorInfo? - PullRequest
5 голосов
/ 15 апреля 2011

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

В моем BLL есть класс BookInfo, который реализует IDataErrorInfo для сообщения о недопустимых значениях, таких как «дата публикации не может быть в будущем» или «количество страниц не может быть отрицательным». Тогда мой AddBookViewModel проверит состояние вновь созданного BookInfo, увидит, что ошибки существуют, и AddBookView отобразит красный шарик рядом с соответствующим TextBox. Это просто, как в примере из поста.

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

Должна ли эта проверка проводиться в моем классе BookInfo? Если это так, то мне придется передать объект AuthorManager моего BLL в конструктор BookInfo, так как первый будет содержать такие методы, как CheckIfExists(int authorID).

Это рекомендуемый подход? Что делать, если в БД много записей? Динамическая проверка повлияет на производительность?

С другой стороны, некоторые проверки в классе BookInfo и некоторые другие могут показаться немного беспорядочными, особенно когда все эти проверки могут быть отнесены к одной и той же группе ... т.е. убедитесь, что вновь созданный объект BookInfo является действительным. Или, может быть, я ошибаюсь, поскольку у меня нет опыта, чтобы правильно судить.

Некоторые рекомендации?

Ответы [ 2 ]

7 голосов
/ 15 апреля 2011

Я бы этого не делал. Я хотел бы, чтобы проверки выполнялись «внутри» IDataErrorInfo просто и без контекста. Любые проверки, которые зависят от контекста, такие как проверки между сущностями и проверки, которые зависят от базы данных, выполняют эту проверку при сохранении изменений.

Попытка этих более сложных контекстных проверок в IDataErrorInfo будет подвержена ошибкам и часто невозможна. Часто невозможно сделать это надежно без контекста.

Я написал в блоге об этом. Хотя он написан в контексте (без каламбура) блока приложения проверки, в нем говорится об общей проблеме проверки на основе контекста. Это может быть полезно. Вот оно .

5 голосов
/ 15 апреля 2011

Я согласен со Стивеном в том, что вы должны выполнять проверку на стороне сервера при попытке сохранить данные.

Другой причиной этого является задержка в сети. Поскольку поддержка WPF для IDataErrorInfo использует входные события для определения того, когда свойства проверяются, и приводит к блокирующему / синхронному вызову вашего объекта VM, использование IDataErrorInfo напрямую влияет на отзывчивость пользовательского интерфейса. Вы не можете начать асинхронный вызов вашей базы данных, чтобы выполнить проверку, а затем отправить ошибки проверки потоку пользовательского интерфейса после завершения сетевого вызова. Вам нужно будет сделать блокирующий вызов вашей БД, чтобы получить результат, который может нанести ущерб потоку пользовательского интерфейса, пока он ожидает возврата вызова.

Я надеюсь, что однажды WPF получит новый интерфейс Silverlight INotifyDataErrorInfo, который допускает сценарий асинхронной проверки, который я описал выше.

...