Messenger Service
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyApp.ViewModel
{
public class MessengerService : ObservableObject
{
private static readonly object creationLock = new object();
private static readonly ConcurrentDictionary<MessengerServiceKey, object> subscribers = new ConcurrentDictionary<MessengerServiceKey, object>();
private static readonly List<object> messageQueue = new List<object>();
private static MessengerService instance;
public static MessengerService Default
{
get
{
if (instance == null)
{
lock (creationLock)
{
instance = new MessengerService();
}
}
return instance;
}
}
public MessengerService()
{
}
public void Subscribe<T>(object subscriber, Action<T> action)
{
subscribers.TryAdd(new MessengerServiceKey(subscriber), action);
}
public void Send<T>(T message)
{
foreach (var action in subscribers.Select(x => x.Value).OfType<Action<T>>())
{
action(message);
}
}
public void AddToMessageQueue<T>(T message)
{
messageQueue.Add(message);
}
public void ProcessMessageQueue<T>()
{
while (messageQueue.Count > 0)
{
object message = messageQueue.OfType<T>().First();
foreach (var action in subscribers.Select(x => x.Value).OfType<Action<T>>())
{
action((T)message);
}
messageQueue.Remove(message);
}
}
}
public class MessengerServiceKey
{
public object Subscriber { get; set; }
public Guid SubscriptionID { get; set; }
public MessengerServiceKey(object subscriber)
{
Subscriber = subscriber;
SubscriptionID = Guid.NewGuid();
}
}
}