我开始学习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。
答案 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/)