public async Task DispatchEventsToSagas(IEnumerable <IEventMessage <DomainEvent> > eventMessages) { foreach (var eventMessage in eventMessages) { HashSet <LocatedSaga> locatedSagas = new HashSet <LocatedSaga>(); foreach (ISagaLocator sagaLocator in sagaLocators) { var addedSagas = await sagaLocator.LocateSagasAsync(eventMessage); foreach (var addedSaga in addedSagas) { locatedSagas.Add(addedSaga); } } foreach (LocatedSaga locatedSaga in locatedSagas) { ISaga saga; if (locatedSaga.Id.HasValue) { var getTask = (Task <ISaga>)GetType().GetMethod(nameof(GetSagaAsync), BindingFlags.Instance | BindingFlags.NonPublic) .MakeGenericMethod(new[] { locatedSaga.SagaType }).Invoke(this, new object[] { locatedSaga.Id }); saga = await getTask; } else { saga = (ISaga)entityFactory.ConstructEntity(locatedSaga.SagaType, Guid.NewGuid()); sagaRepository.Add(saga); } saga.HandleEvent(eventMessage); } } await sagaRepository.SendSagaCommandsAsync(); }
private IEntity ConstructEntity(Type entityType, Guid id) { return(entityFactory.ConstructEntity(entityType, id)); }