我一直在努力解决这个问题......我有一个使用MVP模式编写的程序,我希望有一个LogHandler类,它必须检索一个与这些方法之一中提供的ID相对应的字符串,但它还需要更新GUI,将项目添加到列表框中。所以简单地说,想象一下:
if (name != "Peter")
{
Log.RegisterError(31, 4) //errorType, errorID
}
因此,在Log类中,它将获得与提供的类型和ID匹配的字符串以及MessageBox,但是如果我想将该字符串添加到表单上的控件,该怎么办?我正在使用表单实现的视图来完成GUI更新,但由于这是一个静态类,我不能......
还应该检查和提出错误的位置?主持人?视图?模型?
提前致谢
答案 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
}
}
这是一个非常简单的例子,但应该让你知道如何实现这个目标。