所有类都可以访问的日志管理器类

时间:2013-09-12 00:10:44

标签: c# error-handling mvp

我一直在努力解决这个问题......我有一个使用MVP模式编写的程序,我希望有一个LogHandler类,它必须检索一个与这些方法之一中提供的ID相对应的字符串,但它还需要更新GUI,将项目添加到列表框中。所以简单地说,想象一下:

if (name != "Peter")
{
Log.RegisterError(31, 4) //errorType, errorID
}

因此,在Log类中,它将获得与提供的类型和ID匹配的字符串以及MessageBox,但是如果我想将该字符串添加到表单上的控件,该怎么办?我正在使用表单实现的视图来完成GUI更新,但由于这是一个静态类,我不能......

还应该检查和提出错误的位置?主持人?视图?模型?

提前致谢

1 个答案:

答案 0 :(得分:1)

您可以在其他对象可以订阅的Log类中添加回调。

示例:

在此示例中,Presenter可以侦听要记录的错误代码,然后从Model

的日志中接收错误字符串
public class Logger
{
   private static Dictionary<int, List<Action<string>>> _callbacks = new Dictionary<int,List<Action<string>>>();

    public static void RegisterLoggerCallback(int errorType, Action<string> callback)
    {
        // Just using errortype in this exaple, but the key can be anything you want.
        if (!_callbacks.ContainsKey(errorType))
        {
            _callbacks.Add(errorType, new List<Action<string>>());
        }
        _callbacks[errorType].Add(callback);
    }

    public static void RegisterLog(int errorType, int errorID)
    {
        // find error sring with codes
        string error = "MyError";

        // show messagebox
        MessageBox.Show(error);

        // tell listeners
        if (_callbacks.ContainsKey(errorType))
        {
            _callbacks[errorType].ForEach(a => a(error));
        }
    }
}

public class Model
{
    public Model()
    {
    }

    public void DoSomething()
    {
      Logger.RegisterLog(1, 2);
    }
}

public class Presenter 
{
    public Presenter()
    {
        Logger.RegisterLoggerCallback(1, AddToListbox);
    }

    private void AddToListbox(string error)
    {
        // add to listbox when errortype 1 is called somewhere
    }
}

这是一个非常简单的例子,但应该让你知道如何实现这个目标。