コード例 #1
0
        public async Task <TSagaData> Get <TSagaData>(Guid sagaId, SynchronizedStorageSession session, ContextBag context) where TSagaData : IContainSagaData
        {
            var operations      = new SagaPersisterAtomicOperations(session);
            var incomingMessage = context.Get <IncomingMessage>();
            var messageId       = incomingMessage.MessageId;
            var indexStream     = BuildSagaByIdStreamName(typeof(TSagaData), sagaId);
            var slice           = await session.ReadStreamEventsBackwardAsync(indexStream, -1, 1, true).ConfigureAwait(false);

            if (slice.Status != SliceReadStatus.Success)
            {
                return(default(TSagaData));
            }
            if (slice.Events[0].Event.EventType != SagaIndexEventType)
            {
                return(await operations.ReadSagaData <TSagaData>(indexStream, slice.Events[0], messageId));
            }
            var indexEntry = slice.Events[0].Event.Data.ParseJson <SagaIndexEvent>();
            var dataStream = indexEntry.DataStreamName;

            slice = await session.ReadStreamEventsBackwardAsync(dataStream, -1, 1, true).ConfigureAwait(false);

            if (slice.Status != SliceReadStatus.Success)
            {
                return(default(TSagaData));
            }
            var sagaData = await operations.ReadSagaData <TSagaData>(dataStream, slice.Events[0], messageId);

            // ReSharper disable once CompareNonConstrainedGenericWithNull
            if (sagaData != null)
            {
                return(sagaData);
            }
            throw new Exception($"Either the saga has not yet been created successfully or saga ID {sagaId} has been sent out in a ghost message.");
        }
コード例 #2
0
        public Task Save(IContainSagaData sagaData, SagaCorrelationProperty correlationProperty, SynchronizedStorageSession session, ContextBag context)
        {
            var operations = new SagaPersisterAtomicOperations(session);

            return(correlationProperty != null
                ? SaveSagaWithCorrelationProperty(sagaData, correlationProperty, operations, session)
                : SaveSagaWithoutCorrelationProperty(sagaData, session));
        }
コード例 #3
0
        public async Task <TSagaData> Get <TSagaData>(string propertyName, object propertyValue, SynchronizedStorageSession session, ContextBag context) where TSagaData : IContainSagaData
        {
            var operations      = new SagaPersisterAtomicOperations(session);
            var incomingMessage = context.Get <IncomingMessage>();
            var messageId       = incomingMessage.MessageId;
            var streamName      = BuildSagaDataStreamName(typeof(TSagaData), propertyValue);
            var slice           = await session.ReadStreamEventsBackwardAsync(streamName, -1, 1, true).ConfigureAwait(false);

            if (slice.Status != SliceReadStatus.Success)
            {
                return(default(TSagaData));
            }
            return(await operations.ReadSagaData <TSagaData>(streamName, slice.Events[0], messageId));
        }
コード例 #4
0
        public Task Update(IContainSagaData sagaData, SynchronizedStorageSession session, ContextBag context)
        {
            var operations  = new SagaPersisterAtomicOperations(session);
            var versionInfo = operations.GetSagaVersion(sagaData.Id);

            var dataStream       = versionInfo.StreamName;
            var stateChangeEvent = new EventData(Guid.NewGuid(), SagaDataEventType, true, sagaData.ToJsonBytes(), new byte[0]);

            if (session.SupportsOutbox())
            {
                return(session.AppendViaOutbox(dataStream, versionInfo.Version, stateChangeEvent));
            }
            return(session.AppendToStreamAsync(dataStream, versionInfo.Version, stateChangeEvent));
        }
コード例 #5
0
        static async Task SaveSagaWithCorrelationProperty(IContainSagaData sagaData, SagaCorrelationProperty correlationProperty, SagaPersisterAtomicOperations operations, SynchronizedStorageSession session)
        {
            var propertyValue    = correlationProperty.Value;
            var indexStream      = BuildSagaByIdStreamName(sagaData.GetType(), sagaData.Id);
            var dataStream       = BuildSagaDataStreamName(sagaData.GetType(), propertyValue);
            var stateChangeEvent = new EventData(Guid.NewGuid(), SagaDataEventType, true, sagaData.ToJsonBytes(), new byte[0]);

            await operations.CreateIndex(indexStream, dataStream).ConfigureAwait(false);

            await session.AppendToStreamAsync(dataStream, ExpectedVersion.NoStream, stateChangeEvent).ConfigureAwait(false);
        }