protected virtual void Save(ISaga saga, IEvent by, string bucketId = Bucket.Default) { if (string.IsNullOrWhiteSpace(saga.Id)) throw new ApplicationException("Saga.Id is not specified"); if (OnSavedHook != null) OnSavedHook(this, saga, by); var byTyped = by as DomainEvent; foreach (IEvent e in saga.GetUncommittedEvents()) { var evt = e as DomainEvent; if (evt != null) { evt.SagaId = new Guid(saga.Id); if (byTyped != null) { if (!evt.TenantId.HasValue) evt.TenantId = byTyped.TenantId; if (!evt.IssuedBy.HasValue) evt.IssuedBy = byTyped.IssuedBy; } } } foreach (DomainCommand cmd in saga.GetUndispatchedMessages()) { cmd.SagaId = new Guid(saga.Id); if (byTyped != null) { if (!cmd.TenantId.HasValue) cmd.TenantId = byTyped.TenantId; if (!cmd.IssuedBy.HasValue) cmd.IssuedBy = byTyped.IssuedBy; } } sagas.Save(bucketId, saga, Guid.NewGuid(), _ => { }); }
private IEventStream PrepareStream(string bucketId, ISaga saga, Dictionary <string, object> headers) { IEventStream stream; var sagaKey = bucketId + "+" + saga.Id; if (!_streams.TryGetValue(sagaKey, out stream)) { _streams[saga.Id] = stream = _eventStore.CreateStream(bucketId, saga.Id); } foreach (var item in headers) { stream.UncommittedHeaders[item.Key] = item.Value; } saga.GetUncommittedEvents().Cast <object>().Select(x => new EventMessage { Body = x }).ToList().ForEach(stream.Add); return(stream); }
public void Populate(SagaHolder sagaHolder, ISaga saga) { sagaHolder.Id = saga.Id; sagaHolder.Name = saga.GetType().Name; sagaHolder.Type = saga.GetType().AssemblyQualifiedName; sagaHolder.Key = saga.Key; sagaHolder.Partition = saga.Partition; sagaHolder.State = saga.CurrentState.ToString(); sagaHolder.SerializedSaga = _serializer.ToJson(saga, SerializationOptions); sagaHolder.UncommittedEvents = _serializer.ToJson(_eventConverter.ToEventHolders(saga.GetUncommittedEvents())); var chapterHolders = (from c in saga.Chapters select GetChapterHolderFromChapter(c)).ToArray(); sagaHolder.SerializedChapters = _serializer.ToJson(chapterHolders); if (saga.CurrentChapter != null) sagaHolder.CurrentChapterType = saga.CurrentChapter.GetType().AssemblyQualifiedName; }