/// <inheritdoc /> public SubscriptionToken Subscribe <TEvent>(Action <TEvent> handler) where TEvent : EventBase { if (handler == null) { throw new ArgumentNullException(nameof(handler)); } lock (this._subscriptionsLock) { if (!this._subscriptions.ContainsKey(typeof(TEvent))) { this._subscriptions.Add(typeof(TEvent), new List <ISubscription>()); } var subscriptionToken = new SubscriptionToken(this, typeof(TEvent)); this._subscriptions[typeof(TEvent)].Add(new Subscription <TEvent>(handler, subscriptionToken)); return(subscriptionToken); } }
/// <inheritdoc /> public void Unsubscribe(SubscriptionToken subscriptionToken) { // Ignore null token if (subscriptionToken == null) { this._logger.LogDebug("Unsubscribe called with a null token, ignored."); return; } lock (this._subscriptionsLock) { if (this._subscriptions.ContainsKey(subscriptionToken.EventType)) { var allSubscriptions = this._subscriptions[subscriptionToken.EventType]; var subscriptionToRemove = allSubscriptions.FirstOrDefault(sub => sub.SubscriptionToken.Token == subscriptionToken.Token); if (subscriptionToRemove != null) { this._subscriptions[subscriptionToken.EventType].Remove(subscriptionToRemove); } } } }
public Subscription(Action <TEventBase> action, SubscriptionToken token) { this._action = action ?? throw new ArgumentNullException(nameof(action)); this.SubscriptionToken = token ?? throw new ArgumentNullException(nameof(token)); }