# HG changeset patch # User Steven Robbins # Date 1269876952 -3600 # Node ID b5bbba5660a2097f38e0e5e7a47401268d79440b # Parent ff039a9a19dfe2ea2399da8fd7dfedb8dd579eeb Made the message token disposable. Disposing it removes the registration from the hub. Holds a weak ref to the hub to avoid stopping the hub being collected if subscriptions exist. diff -r ff039a9a19dfe2ea2399da8fd7dfedb8dd579eeb -r b5bbba5660a2097f38e0e5e7a47401268d79440b TinyIoC.Tests/TestData/UtilityMethods.cs --- a/TinyIoC.Tests/TestData/UtilityMethods.cs Sun Mar 21 08:11:57 2010 +0000 +++ b/TinyIoC.Tests/TestData/UtilityMethods.cs Mon Mar 29 16:35:52 2010 +0100 @@ -76,5 +76,14 @@ { return true; } + + public static TinyMessageSubscriptionToken GetTokenWithOutOfScopeMessenger() + { + var messenger = UtilityMethods.GetMessenger(); + + var token = new TinyMessageSubscriptionToken(messenger, typeof(TestMessage)); + + return token; + } } } diff -r ff039a9a19dfe2ea2399da8fd7dfedb8dd579eeb -r b5bbba5660a2097f38e0e5e7a47401268d79440b TinyIoC.Tests/TinyIoC.Tests.csproj --- a/TinyIoC.Tests/TinyIoC.Tests.csproj Sun Mar 21 08:11:57 2010 +0000 +++ b/TinyIoC.Tests/TinyIoC.Tests.csproj Mon Mar 29 16:35:52 2010 +0100 @@ -54,6 +54,7 @@ + diff -r ff039a9a19dfe2ea2399da8fd7dfedb8dd579eeb -r b5bbba5660a2097f38e0e5e7a47401268d79440b TinyIoC/TinyMessenger.cs --- a/TinyIoC/TinyMessenger.cs Sun Mar 21 08:11:57 2010 +0000 +++ b/TinyIoC/TinyMessenger.cs Mon Mar 29 16:35:52 2010 +0100 @@ -121,8 +121,42 @@ /// /// Represents an active subscription to a message /// - public sealed class TinyMessageSubscriptionToken + public sealed class TinyMessageSubscriptionToken : IDisposable { + private WeakReference _Hub; + private Type _MessageType; + + /// + /// Initializes a new instance of the TinyMessageSubscriptionToken class. + /// + public TinyMessageSubscriptionToken(ITinyMessengerHub hub, Type messageType) + { + if (hub == null) + throw new ArgumentNullException("hub"); + + if (!typeof(ITinyMessage).IsAssignableFrom(messageType)) + throw new ArgumentOutOfRangeException("messageType"); + + _Hub = new WeakReference(hub); + _MessageType = messageType; + } + + public void Dispose() + { + if (_Hub.IsAlive) + { + var hub = _Hub.Target as ITinyMessengerHub; + + if (hub != null) + { + var unsubscribeMethod = typeof(ITinyMessengerHub).GetMethod("Unsubscribe", new Type[] {typeof(TinyMessageSubscriptionToken)}); + unsubscribeMethod = unsubscribeMethod.MakeGenericMethod(_MessageType); + unsubscribeMethod.Invoke(hub, new object[] {this}); + } + } + + GC.SuppressFinalize(this); + } } /// @@ -680,7 +714,7 @@ _Subscriptions[typeof(TMessage)] = currentSubscriptions; } - var subscriptionToken = new TinyMessageSubscriptionToken(); + var subscriptionToken = new TinyMessageSubscriptionToken(this, typeof(TMessage)); ITinyMessageSubscription subscription; if (strongReference)