Skip to content

Commit

Permalink
Reduce internal methods
Browse files Browse the repository at this point in the history
  • Loading branch information
geoperez committed Dec 26, 2017
1 parent 310e20f commit b6c8562
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 84 deletions.
111 changes: 39 additions & 72 deletions src/Unosquare.Swan/Components/MessageHub.cs
Expand Up @@ -3,7 +3,7 @@
//
// A simple messenger/event aggregator.
//
// http://hg.grumpydev.com/tinyioc
// https://github.com/grumpydev/TinyIoC/blob/master/src/TinyIoC/TinyMessenger.cs
// ===============================================================================
// Copyright © Steven Robbins. All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
Expand All @@ -20,7 +20,7 @@ namespace Unosquare.Swan.Components
using System.Linq;

#region Message Types / Interfaces

/// <summary>
/// Represents a message subscription
/// </summary>
Expand Down Expand Up @@ -112,7 +112,7 @@ public interface IMessageHub
bool useStrongReferences,
IMessageHubProxy proxy)
where TMessage : class, IMessageHubMessage;

/// <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.
Expand Down Expand Up @@ -209,20 +209,16 @@ private class WeakMessageSubscription<TMessage> : IMessageHubSubscription

public bool ShouldAttemptDelivery(IMessageHubMessage message)
{
if (!_deliveryAction.IsAlive || !_messageFilter.IsAlive)
return false;

return ((Func<TMessage, bool>) _messageFilter.Target).Invoke((TMessage) message);
return _deliveryAction.IsAlive && _messageFilter.IsAlive &&
((Func<TMessage, bool>) _messageFilter.Target).Invoke((TMessage) message);
}

public void Deliver(IMessageHubMessage message)
{
if (!_deliveryAction.IsAlive)
if (_deliveryAction.IsAlive)
{
return;
((Action<TMessage>) _deliveryAction.Target).Invoke((TMessage) message);
}

((Action<TMessage>) _deliveryAction.Target).Invoke((TMessage) message);
}
}

Expand Down Expand Up @@ -279,7 +275,7 @@ public SubscriptionItem(IMessageHubProxy proxy, IMessageHubSubscription subscrip
#endregion

#region Public API

/// <summary>
/// Subscribe to a message type with the given destination and delivery action.
/// Messages will be delivered via the specified proxy.
Expand All @@ -297,9 +293,9 @@ public SubscriptionItem(IMessageHubProxy proxy, IMessageHubSubscription subscrip
IMessageHubProxy proxy = null)
where TMessage : class, IMessageHubMessage
{
return AddSubscriptionInternal(deliveryAction, m => true, useStrongReferences, proxy ?? MessageHubDefaultProxy.Instance);
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.
Expand All @@ -320,66 +316,13 @@ public SubscriptionItem(IMessageHubProxy proxy, IMessageHubSubscription subscrip
bool useStrongReferences = true,
IMessageHubProxy proxy = null)
where TMessage : class, IMessageHubMessage
{
return AddSubscriptionInternal(deliveryAction, messageFilter, useStrongReferences, proxy ?? MessageHubDefaultProxy.Instance);
}

/// <summary>
/// Unsubscribe from a particular message type.
///
/// Does not throw an exception if the subscription is not found.
/// </summary>
/// <typeparam name="TMessage">Type of message</typeparam>
/// <param name="subscriptionToken">Subscription token received from Subscribe</param>
public void Unsubscribe<TMessage>(MessageHubSubscriptionToken subscriptionToken)
where TMessage : class, IMessageHubMessage
{
RemoveSubscriptionInternal<TMessage>(subscriptionToken);
}

/// <summary>
/// Publish a message to any subscribers
/// </summary>
/// <typeparam name="TMessage">Type of message</typeparam>
/// <param name="message">Message to deliver</param>
public void Publish<TMessage>(TMessage message)
where TMessage : class, IMessageHubMessage
{
PublishInternal(message);
}

/// <summary>
/// Publish a message to any subscribers asynchronously
/// </summary>
/// <typeparam name="TMessage">Type of message</typeparam>
/// <param name="message">Message to deliver</param>
/// <returns>A task with the publish</returns>
public Task PublishAsync<TMessage>(TMessage message)
where TMessage : class, IMessageHubMessage
{
return Task.Factory.StartNew(() =>
{
PublishInternal(message);
});
}

#endregion

#region Internal Methods

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

lock (_subscriptionsPadlock)
{
if (!_subscriptions.TryGetValue(typeof(TMessage), out var currentSubscriptions))
Expand All @@ -391,7 +334,7 @@ public Task PublishAsync<TMessage>(TMessage message)
var subscriptionToken = new MessageHubSubscriptionToken(this, typeof(TMessage));

IMessageHubSubscription subscription;
if (strongReference)
if (useStrongReferences)
{
subscription = new StrongMessageSubscription<TMessage>(
subscriptionToken,
Expand All @@ -406,13 +349,20 @@ public Task PublishAsync<TMessage>(TMessage message)
messageFilter);
}

currentSubscriptions.Add(new SubscriptionItem(proxy, subscription));
currentSubscriptions.Add(new SubscriptionItem(proxy ?? MessageHubDefaultProxy.Instance, subscription));

return subscriptionToken;
}
}

private void RemoveSubscriptionInternal<TMessage>(MessageHubSubscriptionToken subscriptionToken)
/// <summary>
/// Unsubscribe from a particular message type.
///
/// Does not throw an exception if the subscription is not found.
/// </summary>
/// <typeparam name="TMessage">Type of message</typeparam>
/// <param name="subscriptionToken">Subscription token received from Subscribe</param>
public void Unsubscribe<TMessage>(MessageHubSubscriptionToken subscriptionToken)
where TMessage : class, IMessageHubMessage
{
if (subscriptionToken == null)
Expand All @@ -431,7 +381,12 @@ private void RemoveSubscriptionInternal<TMessage>(MessageHubSubscriptionToken su
}
}

private void PublishInternal<TMessage>(TMessage message)
/// <summary>
/// Publish a message to any subscribers
/// </summary>
/// <typeparam name="TMessage">Type of message</typeparam>
/// <param name="message">Message to deliver</param>
public void Publish<TMessage>(TMessage message)
where TMessage : class, IMessageHubMessage
{
if (message == null)
Expand Down Expand Up @@ -461,6 +416,18 @@ private void PublishInternal<TMessage>(TMessage message)
});
}

/// <summary>
/// Publish a message to any subscribers asynchronously
/// </summary>
/// <typeparam name="TMessage">Type of message</typeparam>
/// <param name="message">Message to deliver</param>
/// <returns>A task with the publish</returns>
public Task PublishAsync<TMessage>(TMessage message)
where TMessage : class, IMessageHubMessage
{
return Task.Factory.StartNew(() => Publish(message));
}

#endregion
}

Expand Down
17 changes: 7 additions & 10 deletions src/Unosquare.Swan/Components/MessageHubSubscriptionToken.cs
Expand Up @@ -8,7 +8,7 @@
/// <summary>
/// Represents an active subscription to a message
/// </summary>
public sealed class MessageHubSubscriptionToken
public sealed class MessageHubSubscriptionToken
: IDisposable
{
private readonly WeakReference _hub;
Expand Down Expand Up @@ -42,18 +42,15 @@ public MessageHubSubscriptionToken(IMessageHub hub, Type messageType)
/// </summary>
public void Dispose()
{
if (_hub.IsAlive)
if (_hub.IsAlive && _hub.Target is IMessageHub hub)
{
if (_hub.Target is IMessageHub hub)
{
var unsubscribeMethod = typeof(IMessageHub).GetMethod("Unsubscribe",
new[] { typeof(MessageHubSubscriptionToken) });
unsubscribeMethod = unsubscribeMethod.MakeGenericMethod(_messageType);
unsubscribeMethod.Invoke(hub, new object[] { this });
}
var unsubscribeMethod = typeof(IMessageHub).GetMethod(nameof(IMessageHub.Unsubscribe),
new[] {typeof(MessageHubSubscriptionToken)});
unsubscribeMethod = unsubscribeMethod.MakeGenericMethod(_messageType);
unsubscribeMethod.Invoke(hub, new object[] {this});
}

GC.SuppressFinalize(this);
}
}
}
}
4 changes: 2 additions & 2 deletions test/Unosquare.Swan.Test/MessageHubTest.cs
@@ -1,12 +1,12 @@
namespace Unosquare.Swan.Test.MessageHubTests
{
using Components;
using Mocks;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Components;
using Mocks;

[TestFixture]
public class MessageHubMessageBaseConstructor
Expand Down

0 comments on commit b6c8562

Please sign in to comment.