1

我已经为此苦苦挣扎了一段时间......我有一个使用 MVP 模式编写的程序,我想要一个 LogHandler 类,它必须检索与这些方法之一中提供的 ID 对应的字符串,但它也需要更新 GUI,将项目添加到列表框中。所以为了简单起见,想象一下:

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

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

还应该在哪里检查和提出错误?主持人?看法?模型?

提前致谢

4

1 回答 1

1

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

例子:

在此示例中,Presenter可以侦听要记录的错误代码,然后从Model类的 Log 中接收错误字符串

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
    }
}

这是一个非常简单的示例,但应该让您了解实现此目的的方法。

于 2013-09-12T00:36:37.293 回答