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(); } }
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(); })); }