예제 #1
0
        public void RemoveLocalInstanceSubscription(IMessageConsumer consumer)
        {
            var messagesConsumes = reflection.GetMessagesConsumed(consumer);
            var changed          = false;
            var list             = new List <WeakReference>();

            localInstanceSubscriptions.Write(writer =>
            {
                foreach (var type in messagesConsumes)
                {
                    List <WeakReference> value;

                    if (writer.TryGetValue(type.FullName, out value) == false)
                    {
                        continue;
                    }
                    writer.Remove(type.FullName);
                    list.AddRange(value);
                }
            });

            foreach (var reference in list)
            {
                if (ReferenceEquals(reference.Target, consumer))
                {
                    continue;
                }

                changed = true;
            }
            if (changed)
            {
                RaiseSubscriptionChanged();
            }
        }
예제 #2
0
        public IDisposable AddInstanceSubscription(IMessageConsumer consumer)
        {
            var information = new InstanceSubscriptionInformation
            {
                Consumer = consumer,
                InstanceSubscriptionKey = Guid.NewGuid(),
                ConsumedMessages        = reflection.GetMessagesConsumed(consumer),
            };

            subscriptionStorage.AddLocalInstanceSubscription(consumer);
            SubscribeInstanceSubscription(information);

            return(new DisposableAction(() =>
            {
                subscriptionStorage.RemoveLocalInstanceSubscription(information.Consumer);
                UnsubscribeInstanceSubscription(information);
                information.Dispose();
            }));
        }