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);
        }