/// <summary>
        /// Initialises a new instance of <see cref="FeatureStateProvider"/>.
        /// </summary>
        /// <param name="featureProvider">The feature provider.</param>
        /// <param name="configuration">The configuration.</param>
        public FeatureStateProvider(IFeatureProvider featureProvider, IConfiguration configuration)
        {
            _featureProvider = Ensure.IsNotNull(featureProvider, nameof(featureProvider));

            _featuresConfigurationRoot = Ensure.IsNotNull(configuration, nameof(configuration)).GetSection("Features");
            _tenantsConfigurationRoot  = configuration.GetSection("Tenants");

            _rootScope = new FeatureStateProviderScope(_featuresConfigurationRoot, featureProvider, null);
        }
        /// <inheritdoc />
        public void BeginTenantScope(TenantId tenantId)
        {
            if (tenantId.Equals(TenantId.Empty) || tenantId.Equals(TenantId.Default))
            {
                return;
            }

            if (!_scopes.TryGetValue(tenantId, out FeatureStateProviderScope scope))
            {
                scope = new FeatureStateProviderScope(_tenantsConfigurationRoot.GetSection($"{tenantId}:Features"), _featureProvider, _rootScope);
                _scopes.TryAdd(tenantId, scope);
            }
        }
 /// <summary>
 /// Initialises a new instance of <see cref="FeatureStateProviderScope"/>
 /// </summary>
 /// <param name="section">The configuration section.</param>
 /// <param name="featureProvider">The feature provider</param>
 /// <param name="rootScope">[Optional] The root scope.</param>
 public FeatureStateProviderScope(IConfigurationSection section, IFeatureProvider featureProvider, FeatureStateProviderScope rootScope = null)
 {
     _section         = Ensure.IsNotNull(section, nameof(section));
     _featureProvider = Ensure.IsNotNull(featureProvider, nameof(featureProvider));
     _rootScope       = rootScope;
 }