Должен ли я поместить эту функцию в View (код позади) или во ViewModel? - PullRequest
6 голосов
/ 04 марта 2012

Я создаю простое приложение WPF.У меня есть функция OpenFile:

private void OpenFile(string fileName)
{
   if(!File.Exists(Helper.GetPath(fileName)))
   {
      MessageBox.Show("Error opening file");
   }
   else
   {
      //Code to handle file opening
   }
}

В идеале, где эта функция должна присутствовать?Я чувствую, что это должно быть в .xaml.cs, потому что он обращается к MessageBox, который входит в часть View.Но он также называет моего помощника, который есть в модели.Поэтому я тоже думаю, что это может быть в ViewModel.В чем преимущество наличия этого в View или в ViewModel?Может кто-нибудь помочь мне с некоторыми указателями?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 04 марта 2012

Эта функция должна быть в ViewModel. Вам необходимо создать в своем представлении операцию для отображения сообщения об ошибке и вызвать этот метод вместо MessageBox.Show. Отображение окна сообщения необходимо сделать в View.

Как правило, вам следует избегать реализации какой-либо бизнес-логики внутри View, такой как проверка или обработка файла.

7 голосов
/ 04 марта 2012

Одним из преимуществ размещения его в модели представления будет тестируемость. Вы можете написать модульный тест, который проверяет, отображается ли окно сообщения, только если файл существует, например (точнее, это будет интеграционный тест, если вы работаете с файловой системой).

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

Следовательно, я бы работал против абстракции в вашей модели представления, чтобы вы могли высмеивать окно сообщения во время тестов.

2 голосов
/ 04 марта 2012

Если вы используете Microsoft Prism, вы можете использовать интерфейс IInteractionRequest, чтобы представление создавало MessageBox, но фактически передавало необходимый ответ модели представления.

Если вы не используете Microsoft Prism, то посмотрите, как работает эта часть, и либо смоделируйте ее, либо используйте платформу, которая делает что-то похожее.


По сути, этот код должен идти в вашей модели представления для тестируемости, но замените строку, где вы явно вызываете MessageBox, и вместо этого используйте упомянутый IInteractionRequest.

Вот документация, относящаяся к сценарию, который вы хотите реализовать: Глава 6: Расширенные сценарии MVVM . Посмотрите на указанный раздел Шаблоны взаимодействия с пользователем .

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