示例#1
0
 /// <summary>
 /// Subscribe to a message type with the given destination and delivery action.
 /// Messages will be delivered via the specified proxy.
 ///
 /// All messages of this type will be delivered.
 /// </summary>
 /// <typeparam name="TMessage">Type of message</typeparam>
 /// <param name="deliveryAction">Action to invoke when message is delivered</param>
 /// <param name="useStrongReferences">Use strong references to destination and deliveryAction </param>
 /// <param name="proxy">Proxy to use when delivering the messages</param>
 /// <returns>MessageSubscription used to unsubscribing</returns>
 public MessageHubSubscriptionToken Subscribe <TMessage>(
     Action <TMessage> deliveryAction,
     bool useStrongReferences = true,
     IMessageHubProxy proxy   = null)
     where TMessage : class, IMessageHubMessage
 {
     return(Subscribe(deliveryAction, m => true, useStrongReferences, proxy));
 }
示例#2
0
 /// <summary>
 /// Subscribe to a message type with the given destination and delivery action with the given filter.
 /// Messages will be delivered via the specified proxy.
 /// All references (apart from the proxy) are held with WeakReferences
 /// Only messages that "pass" the filter will be delivered.
 /// </summary>
 /// <typeparam name="TMessage">Type of message</typeparam>
 /// <param name="deliveryAction">Action to invoke when message is delivered</param>
 /// <param name="messageFilter">The message filter.</param>
 /// <param name="proxy">Proxy to use when delivering the messages</param>
 /// <returns>
 /// TinyMessageSubscription used to unsubscribing
 /// </returns>
 public MessageHubSubscriptionToken Subscribe <TMessage>(
     Action <TMessage> deliveryAction,
     Func <TMessage, bool> messageFilter,
     IMessageHubProxy proxy)
     where TMessage : class, IMessageHubMessage
 {
     return(AddSubscriptionInternal(deliveryAction, messageFilter, true, proxy));
 }
示例#3
0
 /// <summary>
 /// Subscribe to a message type with the given destination and delivery action.
 /// Messages will be delivered via the specified proxy.
 ///
 /// All messages of this type will be delivered.
 /// </summary>
 /// <typeparam name="TMessage">Type of message</typeparam>
 /// <param name="deliveryAction">Action to invoke when message is delivered</param>
 /// <param name="useStrongReferences">Use strong references to destination and deliveryAction </param>
 /// <param name="proxy">Proxy to use when delivering the messages</param>
 /// <returns>TinyMessageSubscription used to unsubscribing</returns>
 public MessageHubSubscriptionToken Subscribe <TMessage>(
     Action <TMessage> deliveryAction,
     bool useStrongReferences,
     IMessageHubProxy proxy)
     where TMessage : class, IMessageHubMessage
 {
     return(AddSubscriptionInternal(deliveryAction, (m) => true, useStrongReferences, proxy));
 }
示例#4
0
        private MessageHubSubscriptionToken AddSubscriptionInternal <TMessage>(
            Action <TMessage> deliveryAction,
            Func <TMessage, bool> messageFilter,
            bool strongReference,
            IMessageHubProxy proxy)
            where TMessage : class, IMessageHubMessage
        {
            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 MessageHubSubscriptionToken(this, typeof(TMessage));

                IMessageHubSubscription 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);
            }
        }
示例#5
0
        /// <summary>
        /// Subscribe to a message type with the given destination and delivery action with the given filter.
        /// Messages will be delivered via the specified proxy.
        /// All references are held with WeakReferences
        /// Only messages that "pass" the filter will be delivered.
        /// </summary>
        /// <typeparam name="TMessage">Type of message</typeparam>
        /// <param name="deliveryAction">Action to invoke when message is delivered</param>
        /// <param name="messageFilter">The message filter.</param>
        /// <param name="useStrongReferences">Use strong references to destination and deliveryAction</param>
        /// <param name="proxy">Proxy to use when delivering the messages</param>
        /// <returns>
        /// MessageSubscription used to unsubscribing
        /// </returns>
        public MessageHubSubscriptionToken Subscribe <TMessage>(
            Action <TMessage> deliveryAction,
            Func <TMessage, bool> messageFilter,
            bool useStrongReferences = true,
            IMessageHubProxy proxy   = null)
            where TMessage : class, IMessageHubMessage
        {
            if (deliveryAction == null)
            {
                throw new ArgumentNullException(nameof(deliveryAction));
            }

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

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

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

                IMessageHubSubscription subscription;
                if (useStrongReferences)
                {
                    subscription = new StrongMessageSubscription <TMessage>(
                        subscriptionToken,
                        deliveryAction,
                        messageFilter);
                }
                else
                {
                    subscription = new WeakMessageSubscription <TMessage>(
                        subscriptionToken,
                        deliveryAction,
                        messageFilter);
                }

                currentSubscriptions.Add(new SubscriptionItem(proxy ?? MessageHubDefaultProxy.Instance, subscription));

                return(subscriptionToken);
            }
        }
示例#6
0
 public SubscriptionItem(IMessageHubProxy proxy, IMessageHubSubscription subscription)
 {
     Proxy        = proxy;
     Subscription = subscription;
 }