예제 #1
0
        TinyMessageSubscriptionToken AddSubscriptionInternal <TMessage>(Action <TMessage> deliveryAction, Func <TMessage, bool> messageFilter, bool strongReference, ITinyMessageProxy proxy)
            where TMessage : class
        {
            if (deliveryAction == null)
            {
                throw new ArgumentNullException(nameof(deliveryAction));
            }

            if (messageFilter == null)
            {
                throw new ArgumentNullException(nameof(messageFilter));
            }

            if (proxy == null)
            {
                throw new ArgumentNullException(nameof(proxy));
            }

            lock (_subscriptionsPadlock)
            {
                if (!_subscriptions.TryGetValue(typeof(TMessage), out var currentSubscriptions))
                {
                    currentSubscriptions             = new List <SubscriptionItem>();
                    _subscriptions[typeof(TMessage)] = currentSubscriptions;
                }

                var subscriptionToken = new TinyMessageSubscriptionToken(this, typeof(TMessage));

                ITinyMessageSubscription subscription;
                if (strongReference)
                {
                    subscription = new StrongTinyMessageSubscription <TMessage>(subscriptionToken, deliveryAction, messageFilter);
                }
                else
                {
                    subscription = new WeakTinyMessageSubscription <TMessage>(subscriptionToken, deliveryAction, messageFilter);
                }

                currentSubscriptions.Add(new SubscriptionItem(proxy, subscription));

                return(subscriptionToken);
            }
        }
예제 #2
0
        void RemoveSubscriptionInternal <TMessage>(TinyMessageSubscriptionToken subscriptionToken)
            where TMessage : class
        {
            if (subscriptionToken == null)
            {
                throw new ArgumentNullException(nameof(subscriptionToken));
            }

            lock (_subscriptionsPadlock)
            {
                if (!_subscriptions.TryGetValue(typeof(TMessage), out var currentSubscriptions))
                {
                    return;
                }

                var currentlySubscribed = (from sub in currentSubscriptions
                                           where ReferenceEquals(sub.Subscription.SubscriptionToken, subscriptionToken)
                                           select sub).ToList();

                currentlySubscribed.ForEach(sub => currentSubscriptions.Remove(sub));
            }
        }
예제 #3
0
 /// <summary>
 ///     Initializes a new instance of the TinyMessageSubscription class.
 /// </summary>
 /// <param name="subscriptionToken">Destination object</param>
 /// <param name="deliveryAction">Delivery action</param>
 /// <param name="messageFilter">Filter function</param>
 public StrongTinyMessageSubscription(TinyMessageSubscriptionToken subscriptionToken, Action <TMessage> deliveryAction, Func <TMessage, bool> messageFilter)
 {
     SubscriptionToken = subscriptionToken ?? throw new ArgumentNullException(nameof(subscriptionToken));
     _deliveryAction   = deliveryAction ?? throw new ArgumentNullException(nameof(deliveryAction));
     _messageFilter    = messageFilter ?? throw new ArgumentNullException(nameof(messageFilter));
 }
예제 #4
0
 /// <summary>
 ///     Unsubscribe from a particular message type.
 ///     Does not throw an exception if the subscription is not found.
 /// </summary>
 /// <typeparam name="TMessage">Type of message</typeparam>
 /// <param name="subscriptionToken">Subscription token received from Subscribe</param>
 public void Unsubscribe <TMessage>(TinyMessageSubscriptionToken subscriptionToken) where TMessage : class
 {
     RemoveSubscriptionInternal <TMessage>(subscriptionToken);
 }