Исключение / MessageBox в Calibur.Micro - PullRequest
1 голос
/ 20 декабря 2010

Я начинаю изучать Caliburn.Micro, и я немного запутался в обработке с окном исключения / сообщения в классе модели представления.

Я нашел несколько блогов, например:

http://frankmao.com/2010/11/18/handling-messagebox-in-caliburn-micro/

Например, какой-то метод в классе модели представления, который может вызвать исключение.

    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.

1 Ответ

3 голосов
/ 20 декабря 2010

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

Код Фрэнка Мао, с которым вы связались, использует делегата для абстрагирования реализации окна сообщения от модели представления, но здесь я бы использовал интерфейс.Вы можете думать о делегате как об интерфейсе с одним методом, но преимущество использования интерфейса в этом контексте состоит в том, что у вас могут быть разные методы в зависимости от типа сообщения, которое вы хотите показать.Например, вы могли бы иметь 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 / )

...