예제 #1
0
        /// <summary>
        /// 单一订阅
        /// </summary>
        /// <param name="actionType"></param>
        /// <param name="handler"></param>
        /// <param name="useLatestPayload"></param>
        /// <returns></returns>
        public Unsubscibe Subscribe(Type actionType, EventHandler <YEventArgs> handler, bool useLatestPayload = true)
        {
            lock (locker) {
                if (!eventSource.ContainsKey(actionType))
                {
                    eventSource[actionType] = new YEventSource();
                }
                var source = eventSource[actionType];
                WeakEventManager <YEventSource, YEventArgs> .AddHandler(source, nameof(YEventSource.Event), handler);

                if (useLatestPayload && latestPayload?.GetType() == actionType)
                {
                    handler?.Invoke(new YEventSource()
                    {
                        CallFrame = new StackTrace().GetFrame(0)
                    }, new YEventArgs(latestPayload));
                }
            }
            return(() => {
                lock (locker) {
                    var source = eventSource[actionType];
                    WeakEventManager <YEventSource, YEventArgs> .RemoveHandler(source, nameof(YEventSource.Event), handler);
                }
            });
        }
예제 #2
0
        /// <summary>
        /// 集合订阅
        /// </summary>
        /// <param name="handlers"></param>
        /// <param name="useLatestPayload"></param>
        /// <returns></returns>
        public Unsubscibe Subscribe(IDictionary <Type, EventHandler <YEventArgs> > handlers, bool useLatestPayload = true)
        {
            lock (locker) {
                foreach (var pair in handlers)
                {
                    var actionType = pair.Key;
                    var handler    = pair.Value;
                    if (!eventSource.ContainsKey(actionType))
                    {
                        eventSource[actionType] = new YEventSource();
                    }
                    var source = eventSource[actionType];
                    WeakEventManager <YEventSource, YEventArgs> .AddHandler(source, nameof(YEventSource.Event), handler);

                    if (useLatestPayload && latestPayload?.GetType() == actionType)
                    {
                        handler?.Invoke(this, new YEventArgs(latestPayload));
                    }
                }
            }
            return(() => {
                lock (locker) {
                    foreach (var pair in handlers)
                    {
                        var source = eventSource[pair.Key];
                        WeakEventManager <YEventSource, YEventArgs> .RemoveHandler(source, nameof(YEventSource.Event), pair.Value);
                    }
                }
            });
        }