自定義的事件管理器

            自定義的事件管理器框架

              周銀輝函數

 

大多數框架下都提供了事件管理器的,但不使用框架時爲了讓事件發送者和事件接收者之間解耦,就能夠以下寫個簡單的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);
            }
        }
    }
}
相關文章
相關標籤/搜索