2010-12-20 70 views
1

我开始学习Caliburn.Micro,并且我对视图模型类中的exception/messange框处理有点混淆。Calibur.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。

回答

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窗口管理器.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/

+0

谢谢你的质量和冗长的解释。 – Gunter 2010-12-20 15:27:24