Вопрос

Я начинаю изучать 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/)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top