async Task <TSaga> ReadSagaState(MessageSessionContext context) { byte[] state = await context.GetStateAsync().ConfigureAwait(false); if (state == null) { return(default);
public MessageSessionSagaConsumeContext(ConsumeContext <TMessage> context, MessageSessionContext sessionContext, TSaga instance) : base(context) { _sessionContext = sessionContext; Saga = instance; }
async Task <TSaga> ReadSagaState(MessageSessionContext context) { try { using (var stateStream = await context.GetStateAsync().ConfigureAwait(false)) { if (stateStream == null || stateStream.Length == 0) { return(default);
public MessageSessionSagaRepositoryContext(ConsumeContext <TMessage> consumeContext, ISagaConsumeContextFactory <MessageSessionContext, TSaga> factory) : base(consumeContext) { if (!consumeContext.TryGetPayload(out MessageSessionContext sessionContext)) { throw new SagaException($"The session-based saga repository requires an active message session: {TypeMetadataCache<TSaga>.ShortName}", typeof(TSaga), typeof(TMessage)); } _consumeContext = consumeContext; _sessionContext = sessionContext; _factory = factory; }
/// <summary> /// Writes the saga state to the message session /// </summary> /// <param name="context">The message session context</param> /// <param name="saga">The saga state</param> /// <returns>An awaitable task, of course</returns> async Task WriteSagaState(MessageSessionContext context, TSaga saga) { using (var serializeStream = new MemoryStream()) using (var writer = new StreamWriter(serializeStream, Encoding.UTF8, 1024, true)) using (var bsonWriter = new JsonTextWriter(writer)) { JsonMessageSerializer.Serializer.Serialize(bsonWriter, saga); bsonWriter.Flush(); await serializeStream.FlushAsync().ConfigureAwait(false); await context.SetStateAsync(serializeStream.ToArray()).ConfigureAwait(false); } }
/// <summary> /// Writes the saga state to the message session /// </summary> /// <param name="context">The message session context</param> /// <param name="saga">The saga state</param> /// <returns>An awaitable task, of course</returns> async Task WriteSagaState(MessageSessionContext context, TSaga saga) { using (var serializeStream = new MemoryStream()) using (var bsonWriter = new BsonWriter(serializeStream)) { BsonMessageSerializer.Serializer.Serialize(bsonWriter, saga); bsonWriter.Flush(); await serializeStream.FlushAsync().ConfigureAwait(false); using (var stateStream = new MemoryStream(serializeStream.ToArray(), false)) { await context.SetStateAsync(stateStream).ConfigureAwait(false); } } }
async Task <TSaga> ReadSagaState(MessageSessionContext context) { try { using (var stateStream = await context.GetStateAsync().ConfigureAwait(false)) { if (stateStream == null || stateStream.Length == 0) { return(default(TSaga)); } using (var bsonReader = new BsonReader(stateStream)) { return(BsonMessageSerializer.Deserializer.Deserialize <TSaga>(bsonReader)); } } } catch (NotImplementedException exception) { throw new ConfigurationException("NetMessaging must be used for session-based sagas", exception); } }