Вы хотите всегда работать против абстракций в моделях представления, в случае окон сообщений вам не нужно ждать ввода данных пользователем, когда вы приходите на модульное тестирование моделей представления.
Код Фрэнка Мао, с которым вы связались, использует делегата для абстрагирования реализации окна сообщения от модели представления, но здесь я бы использовал интерфейс.Вы можете думать о делегате как об интерфейсе с одним методом, но преимущество использования интерфейса в этом контексте состоит в том, что у вас могут быть разные методы в зависимости от типа сообщения, которое вы хотите показать.Например, вы могли бы иметь ShowMessageError, ShowMessageWarning, ShowMessageInfo и т. Д.
Итак, определите контракт для вашего окна сообщения:
public interface IMessageBox
{
void ShowException(Exception exc);
}
Вставьте зависимость окна сообщения в вашу модель представления, напримерчерез конструктор
public class MyViewModel
{
private readonly IMessageBox messageBox;
public MyViewModel(IMessageBox messageBox)
{
this.messageBox = messageBox;
}
public void MethodThatCanThrowException()
{
try {}
catch(Exception exc)
{
// log the exception here
...
// show message box
this.messageBox.ShowException(exc);
}
}
}
Затем вы можете реализовать окно сообщения в любом случае, используя системное окно сообщений Windows, или лучше использовать свой собственный view / viewmodel для отображения сообщения, возможно, используя Caliburn.Micro WindowManager.ShowDialog ().
Реализация, использующая системное окно сообщений Windows, может выглядеть следующим образом:
public class StandardMessageBox : IMessageBox
{
public void ShowException(Exception exception)
{
MessageBox.Show(exception.ToString(), "Error Occurred");
}
}
В рабочем коде вы можете зарегистрировать StandardMessageBox в интерфейсе IMessageBox в вашем IoCконтейнер.
В модульном тестовом пространстве вы можете смоделировать IMessageBox и заставить его ничего не делать, или в случае методов с результатом из окна сообщения всегда возвращайте желаемое значение.
Для регистрации исключений я бы посмотрел на каркас журналирования, такой как log4net (http://logging.apache.org/log4net/index.html) или NLog(http://nlog -project.org / )