/// <summary> /// Publish an event /// </summary> /// <typeparam name="TEventType"></typeparam> /// <param name="eventToPublish"></param> public void PublishEvent <TEventType>(TEventType eventToPublish) { if (eventToPublish is AggregatedEvent) { AggregatedEvent aggEvent = eventToPublish as AggregatedEvent; if (aggEvent.IsHandled) { return; } } var subsriberType = typeof(ISubscriber <>).MakeGenericType(typeof(TEventType)); var subscribers = GetSubscriberList(subsriberType); List <WeakReference> subsribersToBeRemoved = new List <WeakReference>(); foreach (var weakSubsriber in subscribers) { if (weakSubsriber.IsAlive) { var subscriber = (ISubscriber <TEventType>)weakSubsriber.Target; InvokeSubscriberEvent <TEventType>(eventToPublish, subscriber); } else { subsribersToBeRemoved.Add(weakSubsriber); } //End-if-else (weakSubsriber.IsAlive) } //End-for-each (var weakSubriber in subscribers) if (subsribersToBeRemoved.Any()) { lock (lockSubscriberDictionary) { foreach (var remove in subsribersToBeRemoved) { subscribers.Remove(remove); } //End-for-each (var remove in subsribersToBeRemoved) } //End-lock (lockSubscriberDictionary) } //End-if (subsribersToBeRemoved.Any()) }
private void InvokeSubscriberEvent <TEventType>(TEventType eventToPublish, ISubscriber <TEventType> subscriber) { //Synchronize the invocation of method SynchronizationContext syncContext = SynchronizationContext.Current; if (syncContext == null) { syncContext = new SynchronizationContext(); }//End-if (syncContext == null) if (eventToPublish is AggregatedEvent) { AggregatedEvent aggEvent = eventToPublish as AggregatedEvent; if (aggEvent.IsHandled) { return; } } subscriber.OnEventHandler(eventToPublish); //syncContext.Post(s => subscriber.OnEventHandler(eventToPublish), null); }