Example #1
0
        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));
 }