BasicBus.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Wayne.Lib.MessageBus
  5. {
  6. /// <summary>
  7. /// A very basic, fully synchronous bus implementation. The publish method
  8. /// will execute all subscribe actions.
  9. /// </summary>
  10. public class BasicBus : IBus
  11. {
  12. readonly object subscriptionsLock = new object();
  13. readonly List<SubscriptionBase> subscriptions = new List<SubscriptionBase>();
  14. public virtual void Publish(string topic, object message)
  15. {
  16. SubscriptionBase[] iterationSubscriptions;
  17. lock (subscriptionsLock)
  18. {
  19. iterationSubscriptions = subscriptions.ToArray();
  20. }
  21. iterationSubscriptions
  22. .Where(x => Any.Match(topic, x.TopicFilter))
  23. .Where(x => x.Type.IsInstanceOfType(message))
  24. .ForEach(x =>
  25. {
  26. x.Invoke(topic, message);
  27. });
  28. }
  29. public virtual IDisposable Subscribe<T>(string topicFilter, Action<string, T> action)
  30. {
  31. var subscription = new Subscription<T>()
  32. {
  33. TopicFilter = topicFilter,
  34. InvokeAction = action
  35. };
  36. lock (subscriptionsLock)
  37. {
  38. subscriptions.Add(subscription);
  39. }
  40. return new ActionDisposable(() =>
  41. {
  42. lock (subscriptionsLock)
  43. {
  44. subscriptions.Remove(subscription);
  45. }
  46. });
  47. }
  48. }
  49. }