示例#1
0
        /// <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);
        }