Caliburn.Micro中的例外/消息框

时间:2010-12-20 13:14:34

标签: exception-handling messagebox caliburn.micro

我开始学习Caliburn.Micro,我对视图模型类中的异常/ messange框的处理感到困惑。

我找到了一些博客,例如:

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 个答案:

答案 0 :(得分:3)

您希望始终在视图模型中对抗抽象,对于消息框,您不希望在进行单元测试视图模型时等待用户输入。

您链接的Frank Mao代码使用委托从视图模型中抽象出消息框的实现,但我会在这里使用一个接口。您可以将委托视为具有单个方法的接口,但在此上下文中使用接口的优点是,您可以根据要显示的消息类型使用不同的方法。例如,您可以拥有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系统消息框随意实现消息框,或者更好地使用您自己的视图/视图模型来显示消息,可能使用Caliburn.Micro WindowManager.ShowDialog()。

使用Windows系统消息框的实现可能如下所示:

public class StandardMessageBox : IMessageBox
{
  public void ShowException(Exception exception)
  {
    MessageBox.Show(exception.ToString(), "Error Occurred");
  }
}

在生产代码中,您可以在IoC容器中的IMessageBox接口上注册StandardMessageBox。

在单元测试中,您可以模拟出IMessageBox并使其无效,或者在带有消息框结果的方法的情况下,始终返回您希望的值。

为了记录异常,我会查看一个日志框架,例如log4net(http://logging.apache.org/log4net/index.html)或NLog(http://nlog-project.org/