using System.Collections.Generic;
public static void Main()
var ea = new EventAggregator();
var client = new SomeClient(ea);
var actor = new SomeActor(ea);
public interface IHandle {}
public interface IHandle<TEvent> : IHandle
public class EventAggregator
private List<IHandle> _subscribers = new List<IHandle>();
public void Subscribe<TSubscriber>(TSubscriber s) where TSubscriber : IHandle
if (!_subscribers.Contains(s))
public void Publish<TEvent>(TEvent e)
var eventSubsribers = _subscribers.OfType<IHandle<TEvent>>().ToArray();
foreach (var s in eventSubsribers)
public class SomeEvent {}
public class SomeClient : IHandle<SomeEvent>
public SomeClient(EventAggregator ea)
public void Handle(SomeEvent e)
Console.WriteLine("Catched " + e);
private readonly EventAggregator _ea;
public SomeActor(EventAggregator ea)
public void DoSomething()
Console.WriteLine("Fired " + e);