using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace Wayne.Lib.MessageBus { /// /// A very basic, fully synchronous bus implementation. The publish method /// will execute all subscribe actions. /// public class BasicBus : IBus { readonly object subscriptionsLock = new object(); readonly List subscriptions = new List(); public void Publish(string topic, object message) { SubscriptionBase[] iterationSubscriptions; lock (subscriptionsLock) { iterationSubscriptions = subscriptions.ToArray(); } iterationSubscriptions .Where(x => x.TopicFilter.IsMatch(topic)) .Where(x => x.Type.IsInstanceOfType(message)) .ForEach(x => { x.Invoke(topic, message); }); } public IDisposable Subscribe(string topicFilter, Action action) { var subscription = new Subscription() { TopicFilter = new Regex("^" + topicFilter.Replace("*", "[^/]*") + "$"), InvokeAction = action }; lock (subscriptionsLock) { subscriptions.Add(subscription); } return new ActionDisposable(() => { lock (subscriptionsLock) { subscriptions.Remove(subscription); } }); } } }