/// <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)); }
/// <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)); }
/// <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)); }
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); } }
/// <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); } }
public SubscriptionItem(IMessageHubProxy proxy, IMessageHubSubscription subscription) { Proxy = proxy; Subscription = subscription; }