Calibur.Micro 中的异常/消息框

问题描述 投票:0回答:1

我开始学习 Caliburn.Micro,我对视图模型类中的异常/消息框的处理有点困惑。

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

https://maonet.wordpress.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。

exception messagebox caliburn.micro
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/) )

© www.soinside.com 2019 - 2024. All rights reserved.