/// <inheritdoc/> public Task Unsubscribe <T>(BusEvent <T> eventMessage) where T : class { if (eventMessage == null) { throw new ArgumentNullException(nameof(eventMessage)); } var @event = (eventMessage is PlatformEvent <T>) ? eventMessage as PlatformEvent <T> : throw new ArgumentException($"{nameof(eventMessage)} must be type of {nameof(PlatformEvent<T>)}"); if (!typeof(IMessageListener).IsAssignableFrom(typeof(T))) { throw new InvalidOperationException("Type parameter must be an IMessageListener"); } var eventName = eventMessage.Name; if (string.IsNullOrWhiteSpace(eventName)) { throw new ArgumentException($"EventName of {nameof(eventMessage)} cannot be empty"); } var key = new SubscriptionInfo(eventName, @event.ReplayId, typeof(T)); if (!_subscriptions.ContainsKey(key)) { return(Task.CompletedTask); } // build channel segment var topicName = GetEventOrTopicName(eventMessage.Name); var handler = _subscriptions[key]; _streamingClient.UnsubscribeTopic(topicName, handler as IMessageListener, @event.ReplayId); _subscriptions.TryRemove(key, out var val); return(Task.CompletedTask); }