using System.Collections.Generic;
public interface IMessage
public class MessageBroker
private Dictionary<Type, List<Action<IMessage>>> m_messageHandlers = new Dictionary<Type, List<Action<IMessage>>>();
public void RegisterHandler(Type messageType, Action<IMessage> handler)
List<Action<IMessage>> handlers = null;
if (!m_messageHandlers.TryGetValue(messageType, out handlers))
handlers = new List<Action<IMessage>>();
m_messageHandlers[messageType] = handlers;
public void HandleMessage(IMessage message)
List<Action<IMessage>> handlers = null;
var messageType = message.GetType();
if (m_messageHandlers.TryGetValue(messageType, out handlers))
foreach (var handler in handlers)
Console.WriteLine(string.Format("No handler found for message of type {0}", messageType.FullName));
public interface IComponent
void Register(MessageBroker messageBroker);
public class ExampleMessageA : IMessage
public class ExampleMessageB : IMessage
public class ExampleComponent : IComponent
public void Register(MessageBroker messageBroker)
messageBroker.RegisterHandler(typeof(ExampleMessageA), HandleMessageA);
messageBroker.RegisterHandler(typeof(ExampleMessageB), HandleMessageB);
private void HandleMessageA(IMessage message)
var exampleMessageA = (ExampleMessageA)message;
Console.WriteLine("Handling message of type ExampleMessageA");
private void HandleMessageB(IMessage message)
var exampleMessageB = (ExampleMessageB)message;
Console.WriteLine("Handling message of type ExampleMessageB");
public static void Main()
var messageBroker = new MessageBroker();
var myComponent = new ExampleComponent();
myComponent.Register(messageBroker);
var messageA = new ExampleMessageA();
messageBroker.HandleMessage(messageA);
var messageB = new ExampleMessageB();
messageBroker.HandleMessage(messageB);