internal IStateManager ResolveStateManager(StateManagerConfiguration stateManagerConfiguration)
        {
            var stateManagerKey = stateManagerConfiguration.StateNamespace;

            if (_resolvedStateManagers.TryGetValue(stateManagerConfiguration.StateNamespace, out var stateManager))
            {
                return(stateManager);
            }

            return(CreateAndCacheStateManager(stateManagerConfiguration));;
        }
        private StateManagementMiddleware UseState(StateManagerConfiguration stateManagerConfiguration, Action <StateManagerConfigurationBuilder> configure = null)
        {
            if (stateManagerConfiguration == null)
            {
                throw new ArgumentNullException(nameof(stateManagerConfiguration));
            }

            configure?.Invoke(new StateManagerConfigurationBuilder(stateManagerConfiguration));

            _configuredStateManagers[stateManagerConfiguration.StateNamespace] = stateManagerConfiguration;

            _autoLoadEnabled = stateManagerConfiguration.AutoLoad;

            return(this);
        }
        private IStateManager CreateAndCacheStateManager(StateManagerConfiguration stateManagerConfiguration)
        {
            if (stateManagerConfiguration == null)
            {
                throw new ArgumentNullException(nameof(stateManagerConfiguration));
            }

            if (!_availableStateStores.TryGetValue(stateManagerConfiguration.StateStoreName, out var configuredStateStore))
            {
                if (stateManagerConfiguration.StateManagerType != null)
                {
                    throw new InvalidOperationException($"State manager of type \"{stateManagerConfiguration.StateManagerType.FullName}\" was configured to use a state store named \"{stateManagerConfiguration.StateStoreName}\", but no such named state store was configured. Please check your middleware configuration.");
                }

                throw new InvalidOperationException($"State manager for namespace \"{stateManagerConfiguration.StateNamespace}\" was configured to use a state store named \"{stateManagerConfiguration.StateStoreName}\", but no such named state store was configured. Please check your middleware configuration.");
            }

            var stateManager = default(IStateManager);

            if (stateManagerConfiguration.StateManagerType != null)
            {
                if (stateManagerConfiguration.Factory != null)
                {
                    stateManager = stateManagerConfiguration.Factory(_turnContext, configuredStateStore);
                }
                else
                {
                    try
                    {
                        stateManager = (IStateManager)Activator.CreateInstance(stateManagerConfiguration.StateManagerType, configuredStateStore);
                    }
                    catch (Exception createException)
                    {
                        throw new Exception($"Failed to create an instance of a typed state manager: {stateManagerConfiguration.StateManagerType.FullName}. Please check the inner exception for more details.", createException);
                    }
                }
            }
            else
            {
                stateManager = new StateManager(stateManagerConfiguration.StateNamespace, configuredStateStore);
            }

            _resolvedStateManagers.Add(stateManagerConfiguration.StateNamespace, stateManager);

            return(stateManager);
        }
 internal StateManagerConfigurationBuilder(StateManagerConfiguration configuration)
 {
     Configuration = configuration;
 }