# 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)