2010-12-20 66 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