async Task Consume(IDependencyScope scope, EventualConsistentEvent eventualConsistent) { var unitOfWork = scope.Resolve <IUnitOfWork>(); var repository = scope.Resolve <IEventRepository>(); var eventType = eventualConsistent.Event.GetType(); var context = _eventHandlerRunnerCache .Get(eventType) // TODO: change .Get parameter to event's full type name? try to reduce GetType() and reflection calls during events handling .FirstOrDefault(x => x.EventHandlerName == eventualConsistent.EventHandlerName); if (context == null) { throw new EventHandlerRunnerContextNotFoundException(eventType.FullName, eventualConsistent.EventHandlerName); } await context.Runner(scope, eventualConsistent.Event); await repository.Remove(eventualConsistent.Event); await unitOfWork.Commit(); }
async Task DispatchEvent(IEvent @event) { var contexts = _cache.Get(@event.GetType()); foreach (var context in contexts) { if (context.EventualConsistent) { var eventualConsistent = new EventualConsistentEvent(@event, context.EventHandlerName); await _repository.Add(eventualConsistent); _eventualConsistentEvents.Enqueue(eventualConsistent); } else { await RunEventHandler(@event, context); } } }