/// <summary> /// Performs controller action pre-procesing to ensure that at least one of the specified features are enabled. /// </summary> /// <param name="context">The context of the MVC action.</param> /// <param name="next">The action delegate.</param> /// <returns>Returns a task representing the action execution unit of work.</returns> public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var fm = context.HttpContext.RequestServices.GetRequiredService <IFeatureManagerSnapshot>(); // // Enabled state is determined by either 'any' or 'all' features being enabled. bool enabled = RequirementType == RequirementType.All ? await Features.All(async feature => await fm.IsEnabledAsync(feature).ConfigureAwait(false)) : await Features.Any(async feature => await fm.IsEnabledAsync(feature).ConfigureAwait(false)); if (enabled) { await next().ConfigureAwait(false); } else { IDisabledFeaturesHandler disabledFeaturesHandler = context.HttpContext.RequestServices.GetService <IDisabledFeaturesHandler>() ?? new NotFoundDisabledFeaturesHandler(); await disabledFeaturesHandler.HandleDisabledFeatures(Features, context).ConfigureAwait(false); } }
/// <summary> /// Registers a disabled feature handler. This will be invoked for MVC actions that require a feature that is not enabled. /// </summary> /// <param name="builder">The feature management builder.</param> /// <param name="disabledFeaturesHandler">The disabled feature handler.</param> /// <returns>The feature management builder.</returns> public static IFeatureManagementBuilder UseDisabledFeaturesHandler(this IFeatureManagementBuilder builder, IDisabledFeaturesHandler disabledFeaturesHandler) { builder.Services.AddSingleton <IDisabledFeaturesHandler>(disabledFeaturesHandler ?? throw new ArgumentNullException(nameof(disabledFeaturesHandler))); return(builder); }