public static async Task SaveStateAsync(IStorage storage, PersistedStateKeys keys, PersistedState newState, PersistedState oldState = null, string eTag = null) { // Check for state changes var save = false; Dictionary <string, object> changes = new Dictionary <string, object>(); if (oldState != null) { if (JsonConvert.SerializeObject(newState.UserState) != JsonConvert.SerializeObject(oldState.UserState)) { if (eTag != null) { newState.UserState[ETAG] = eTag; } changes[keys.UserState] = newState.UserState; save = true; } if (JsonConvert.SerializeObject(newState.ConversationState) != JsonConvert.SerializeObject(oldState.ConversationState)) { if (eTag != null) { newState.ConversationState[ETAG] = eTag; } changes[keys.ConversationState] = newState.ConversationState; save = true; } } else { if (eTag != null) { newState.UserState[ETAG] = eTag; newState.ConversationState[ETAG] = eTag; } changes[keys.UserState] = newState.UserState; changes[keys.ConversationState] = newState.ConversationState; save = true; } // Save changes if (save) { await storage.WriteAsync(changes).ConfigureAwait(false); } }
/// <summary> /// Initializes a new instance of the <see cref="PersistedState"/> class. /// </summary> /// <param name="keys">The persisted keys.</param> /// <param name="data">The data containing the state values.</param> public PersistedState(PersistedStateKeys keys, IDictionary <string, object> data) { UserState = data.ContainsKey(keys.UserState) ? (IDictionary <string, object>)data[keys.UserState] : new ConcurrentDictionary <string, object>(); ConversationState = data.ContainsKey(keys.ConversationState) ? (IDictionary <string, object>)data[keys.ConversationState] : new ConcurrentDictionary <string, object>(); }
public static async Task <PersistedState> LoadStateAsync(IStorage storage, PersistedStateKeys keys) { var data = await storage.ReadAsync(keys.ToArray()).ConfigureAwait(false); return(new PersistedState(keys, data)); }