You can use Reactive Extensions to create message bus – a communication component to publish and subscribe to messages. See basic implementation.
Here I have simple Message class and MessageBus based on Rx ISubject. Bus has only two methods: one for sending the message and one for handling published message.
class MessageBus
{
private readonly ISubject<Message> _subject;
public MessageBus()
{
_subject = new Subject<Message>();
}
public void Publish(Message msg)
{
if (string.IsNullOrEmpty(msg.Recipient))
{
_subject.OnError(new InvalidOperationException("Message recipient is unknown."));
}
else
{
_subject.OnNext(msg);
}
}
public void Subscribe(string recipient, Action<Message> action)
{
_subject
.Where(m => m.Recipient == recipient)
.Subscribe(action);
}
}
private static void UseMessageBus()
{
//create message bus
var b = new MessageBus();
//subscribe to receive messages for two people
//subscribing for messages to Bob only
b.Subscribe("Bob", m => Console.WriteLine($"Bob, you got a message: {m.Content}"));
//subscribing for messages to Mark only
b.Subscribe("Mark", m => Console.WriteLine($"Message to you, Mark: {m.Content}"));
//publish some messages
b.Publish(new Message("Mark", "Hello, Mark!"));
b.Publish(new Message("Bob", "Hello, Bob!"));
b.Publish(new Message("John", "Hello, John!")); //we are not subscribed to, will not be handled
b.Publish(new Message("Mark", "Do shopping, please!"));
b.Publish(new Message("Mark", "Clean your room, please!"));
}