1

我开始学习 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。

4

1 回答 1

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/ )

于 2010-12-20T14:32:13.947 回答