私はあなたのコントローラーがイベントを発生させるべきではないと思います、それはあなたがあなたのドメイン固有の検証をした後あなたのドメインロジックのための何かであるべきです。検証を行って動作することを確認する前に、実際に何かが発生したことをどのように確認できますか?
ただし、単純なイベントベースのソリューションを実装することはそれほど難しくありません。私は次のようなものを選びます:
public abstract class BaseEvent {}
public class EventRouter {
private Dictionary<Type, List<Action<BaseEvent>>> _eventRoutes;
public EventRouter ()
{
_eventRoutes= new Dictionary<Type, List<Action<BaseEvent >>>();
}
public void Register<TEvent>(Action<TEvent> route) where TEvent : BaseEvent
{
List<Action<TEvent>> routes;
var type = typeof(BaseEvent);
if (_eventRoutes.TryGetValue(type, out routes).IsFalse())
{
routes = new List<Action<TEvent>>();
_eventRoutes.Add(type, routes);
}
routes.Add((y) => route(y as BaseEvent));
}
public bool TryGetValue(Type commandType, out List<Action<TEvent>> handlers)
{
return _eventRoutes.TryGetValue(eventType, out handlers);
}
}
public class InMemoryEventDispatcher : IEventBus
{
private readonly IEventRouter _eventRouter;
public InMemoryEventBus(IEventRouter eventRouter)
{
_eventRouter = eventRouter;
}
public void PublishEvent<TEvent>(TEvent @event) where TEvent : BaseEvent
{
var eventType = @event.GetType();
List<Action<TEvent>> eventHandlers;
if (_eventRouter.TryGetValue(eventType, out eventHandlers).IsTrue())
{
foreach (var eventHandler in eventHandlers)
{
eventHandler(@event);
}
}
}
public void PublishEvents<TEvent>(IEnumerable<BaseEvent> events) where TEvent : BaseEvent
{
foreach (var @event in events)
{
PublishEvent(@event);
}
}
}
これで、イベントごとに実行するアクションを登録できます。私はそれをコンパイルしていませんが、そのようなものが行くはずです。