/// <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); } }); }
/// <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); } } }); }