public void AddSubscription(IEventSubscription sub)
        {
            // if the subscription is a wiretap, add it to a different list
            if (sub.IsWiretap()) { _wiretaps.Add(sub); return; }

            lock (_subscriptions)
            {
                if (false == _subscriptions.ContainsKey(sub.Topic))
                {
                    _subscriptions.Add(sub.Topic, new List<IEventSubscription>());
                }

                _subscriptions[sub.Topic].Add(sub);
            }
        }
        public void AddSubscription(IEventSubscription subscription)
        {
            List<IExchange> exchanges = new List<IExchange>();

            if (subscription.IsWiretap())
            {
                exchanges.AddRange(_exchangeLocator.GetAllExchanges());
            }
            else
            {
                // find out which exchange we need to bind to
                exchanges.Add(_exchangeLocator.GetExchange(subscription.Topic));
            }

            exchanges.ForEach(ex =>
            {
                // now, get or declare the queue for this exchange
                IQueue queue = this.GetQueue(ex);

                // create a binding
                AmqpBinding binding = new AmqpBinding(ex, subscription.Topic);

                // add the binding to the queue if it doesn't already exist
                if (false == queue.ContainsBinding(binding))
                {
                    queue.AddBinding(binding);
                }

                // ensure an entry for this binding exists
                if (false == _bindingCount.ContainsKey(binding))
                {
                    _bindingCount.Add(binding, 0);
                }

                // finally, increment the count of subscriptions for this binding
                _bindingCount[binding]++;
            });
        }
        public void RemoveSubscription(IEventSubscription sub)
        {
            // if the subscription is a wiretap, remove it from a different list
            if (sub.IsWiretap()) { _wiretaps.Remove(sub); return; }

            lock (_subscriptions)
            {
                if (_subscriptions.ContainsKey(sub.Topic))
                {
                    if (_subscriptions[sub.Topic].Contains(sub))
                    {
                        _subscriptions[sub.Topic].Remove(sub);
                    }
                }
            }
        }