自定義的事件管理器框架
周銀輝函數
大多數框架下都提供了事件管理器的,但不使用框架時爲了讓事件發送者和事件接收者之間解耦,就能夠以下寫個簡單的spa
public enum EventAdministratorEventTypes { ApplicationStartup, //在這裏添加你須要的事件 } public class EventAdministratorEventArgs : EventArgs { public object Arg { get; protected set; } public EventAdministratorEventArgs(object arg) { Arg = arg; } } public class EventAdministrator { private static EventAdministrator instance; public static EventAdministrator Instance { get { return instance ?? (instance = new EventAdministrator()); } } /// <summary> /// 用於存儲event和它對於的回調函數列表的字典(event 和 callback是一對多的關係) /// </summary> private readonly Dictionary<EventAdministratorEventTypes, List<EventHandler<EventAdministratorEventArgs>>> eventAndCallbackBuffer = new Dictionary<EventAdministratorEventTypes, List<EventHandler<EventAdministratorEventArgs>>>(); private void AddCallbackForEvent(EventAdministratorEventTypes eventName, EventHandler<EventAdministratorEventArgs> callback) { if (!eventAndCallbackBuffer.ContainsKey(eventName)) { eventAndCallbackBuffer.Add(eventName, new List<EventHandler<EventAdministratorEventArgs>>()); } var callbackList = eventAndCallbackBuffer[eventName]; //添加時斷定不存在爲了防止屢次註冊後引發屢次調用回調函數 if (!callbackList.Contains(callback)) { callbackList.Add(callback); } } /// <summary> /// 註冊爲事件接受者 /// </summary> /// <param name="eventName">事件名稱</param> /// <param name="callback">事件發生時的回調函數</param> public void Register(EventAdministratorEventTypes eventName, EventHandler<EventAdministratorEventArgs> callback) { AddCallbackForEvent(eventName, callback); } /// <summary> /// 觸發一個事件 /// </summary> /// <param name="sender">觸發者</param> /// <param name="eventName">事件名稱</param> /// <param name="args">觸發該事件時所帶的參數</param> public void Send(object sender, EventAdministratorEventTypes eventName, EventAdministratorEventArgs args) { if (!eventAndCallbackBuffer.ContainsKey(eventName)) { Logger.Warning("EventAdministrator:事件"+eventName+"被觸發,但沒有任何對象註冊該事件." + " 致使這個狀況的緣由可能有:代碼中沒有調用相應的Register函數來註冊該事件; 或者 事件的Send函數發生在Register以前"); return; } var callbackList = eventAndCallbackBuffer[eventName]; foreach (var callback in callbackList) { callback.Invoke(sender, args); } } } }