using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Messaging { public sealed class MessageBus : IMessageBus { internal class Subscriber<TMessage> { public int? _id; public Action<TMessage> _handler=null; public Subscriber(int? id, Action<TMessage> handler) { _id = id; _handler = handler; } } private Dictionary<Type, List<Object>> _Subscribers = new Dictionary<Type, List<Object>>(); public void Subscribe<TMessage>(int? subscriberId, Action<TMessage> handler) { var Subscriber = new Subscriber<TMessage>(subscriberId, handler); if (_Subscribers.ContainsKey(typeof(TMessage))) { var handlers = _Subscribers[typeof(TMessage)]; handlers.Add(Subscriber); } else { var handlers = new List<Object>(); handlers.Add(Subscriber); _Subscribers[typeof(TMessage)] = handlers; } } public void Unsubscribe<TMessage>(Action<TMessage> handler) { if (_Subscribers.ContainsKey(typeof(TMessage))) { var handlers = _Subscribers[typeof(TMessage)]; handlers.Remove(handler); if (handlers.Count == 0) { _Subscribers.Remove(typeof(TMessage)); } } } public void Publish<TMessage>(int? subscriberId, TMessage message) { if (_Subscribers.ContainsKey(typeof(TMessage))) { var subscribers = _Subscribers[typeof(TMessage)]; foreach (Subscriber<TMessage> subscriber in subscribers) { var id = subscriber._id; var handler = subscriber._handler; if((!id.HasValue) || (id.HasValue && (id == subscriberId))) handler.Invoke(message); } } } } }
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)