Skip to content

Instantly share code, notes, and snippets.

@hagbarddenstore
Created February 21, 2014 13:15
Show Gist options
  • Save hagbarddenstore/9134019 to your computer and use it in GitHub Desktop.
Save hagbarddenstore/9134019 to your computer and use it in GitHub Desktop.
private IEnumerable<Task> CreateHandlerTasks(IDomainEvent domainEvent)
{
if (domainEvent == null)
{
return new Task[0];
}
Func<IDomainEvent, IEnumerable<Task>> handlerCreator;
var type = domainEvent.GetType();
if (CachedHandlerCreators.TryGetValue(type, out handlerCreator))
{
return handlerCreator(domainEvent);
}
var methodInfo = typeof(MultiDomainEventMessageHandler).GetMethod("CreateHandler", BindingFlags.Instance | BindingFlags.NonPublic)
.MakeGenericMethod(type);
handlerCreator = Expression.Lambda<Func<IDomainEvent, IEnumerable<Task>>>(
Expression.Call(Expression.Constant(this), methodInfo)).Compile();
CachedHandlerCreators.Add(type, handlerCreator);
return handlerCreator(domainEvent);
}
private IEnumerable<Task> CreateHandler<T>(IDomainEvent domainEvent)
{
var handlers = _container.GetAllInstances<Rebus.IHandleMessages<T>>();
Action<object> a = _ =>
{
var handlerDomainEventPair = _ as HandlerDomainEventPair<T>;
if (handlerDomainEventPair != null)
{
handlerDomainEventPair.Handler.Handle(handlerDomainEventPair.DomainEvent);
}
};
return handlers.Select(handler => new Task(a, new HandlerDomainEventPair<T>(handler, (T)domainEvent)));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment