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();
        }
Пример #2
0
        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);
                }
            }
        }