public void Save(ISagaEx saga, Guid commitId, Action <IDictionary <string, object> > updateHeaders) { if (saga == null) { throw new ArgumentNullException("saga"); } Dictionary <string, object> headers = PrepareHeaders(saga, updateHeaders); IEventStream stream = PrepareStream(saga, headers); Persist(stream, commitId); ReleaseAggregateId(saga.Id); saga.ClearUncommittedEvents(); saga.ClearUndispatchedMessages(); }
static Dictionary <string, object> PrepareHeaders( ISagaEx saga, Action <IDictionary <string, object> > updateHeaders) { var headers = new Dictionary <string, object>(); headers[SagaTypeHeader] = saga.GetType().FullName; if (updateHeaders != null) { updateHeaders(headers); } int i = 0; foreach (object command in saga.GetUndispatchedMessages()) { headers[UndispatchedMessageHeader + i++] = command; } return(headers); }
IEventStream PrepareStream(ISagaEx saga, Dictionary <string, object> headers) { IEventStream stream; if (!_streams.TryGetValue(saga.Id, out stream)) { _streams[saga.Id] = stream = _eventStore.CreateStream(saga.Id); } foreach (var item in headers) { stream.UncommittedHeaders[item.Key] = item.Value; } Enumerable.Cast <object>(saga.GetUncommittedEvents()) .Select(x => new EventMessage { Body = x }) .ToList() .ForEach(stream.Add); return(stream); }