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