Исключение / Окно обмена сообщениями в Calibur.Micro
-
11-10-2019 - |
Вопрос
Я начинаю изучать Caliburn.Micro и меня немного смущает работа с полем исключений / сообщений в классе view model.
Я нашел несколько блогов, например, о:
http://frankmao.com/2010/11/18/handling-messagebox-in-caliburn-micro/
Например, какой-то метод в классе view model, который может выдавать исключение.
public void MethodWichCanProduceEx(string arg1, string arg2 )
{
if(arg1==null)
throw new ArgumentNullException("arg1 is null");
if (arg2 == null)
throw new ArgumentNullException("arg2 is null");
try
{
}
catch (Exception exception)
{
throw exception;
//? show message box MessageBox.Shox(exception.Message)
}
}
Как правильно обрабатывать и показывать эти исключения в поле зрения?Существует ли какой-либо шаблон для caliburn.micro?
Возможно ли отследить исключение, как в .NET, в текстовом, XML-файле?
Например, я хотел бы отслеживать исключение в xml, текстовом файле и в представлении показывать только message.box или что-то в этом роде.
Заранее благодарю, возможно, мой вопрос немного глупый, извините, я только изучаю calibur.micro.
Решение
Вам захочется всегда работать с абстракциями в ваших моделях представления, в случае с окнами сообщений вам не нужно ждать ввода данных пользователем, когда вы приступаете к модульному тестированию ваших моделей представления.
Код Фрэнка Мао, на который вы ссылаетесь, использует делегат для абстрагирования реализации окна сообщения от модели представления, но я бы использовал здесь интерфейс.Вы можете думать о делегате как об интерфейсе с одним методом, но преимущество использования интерфейса в данном контексте заключается в том, что у вас могут быть разные методы в зависимости от типа сообщения, которое вы хотите показать.Например, у вас может быть 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/)