De a poco estamos descubriendo todo el potencial que los Feature Flags tienen parea ofrecernos, aprendimos los conceptos principales, como usar Feature Flags condiciones y como manejar Features Flags inactivas.

En esta ocasión veremos como aplicar aplicar filtros MVC y middlewares solo si determinada funcionalidad se encuentra activa.

Filtros MVC

Los filtros MVC nos permiten agregar funcionalidad en forma muy versátil y dinámica como parte del procesamiento de una petición o request. Una de las principales características es que podemos agregar funcionalidad sin necesariamente modificar un controlador o acción.

Los Feature Flags nos van a permitir aplicar filtros MVC solo si una funcionalidad determinada se encuentra activa.

Requerimiento

Tenemos un filtro MVC AddBetaHeaderFilter que agrega una cabecera especial a la petición indicando que la versión en ejecución es "Beta". De esta forma otros componentes pueden realizar modificaciones a la petición según la versión.

public class AddBetaHeaderFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(
        ActionExecutingContext context, 
        ActionExecutionDelegate next)
    {
        context.HttpContext
            .Request
            .Headers
            .Add("X-Version", "Beta");

        await next();
    }
}

Necesitamos aplicar este filtro solo y solo si el Feature Flag "Beta" se encuentra activo.

Implementación

Por suerte para nosotros solo necesitamos agregar el filtro a los filtros generales de MVC utilizando el helper AddForFeature<>. Para esto modificaremos la llamada a services.AddControllersWithViews() del método ConfigureServices de la clase Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews(options =>
        options.Filters.AddForFeature<AddBetaHeaderFilter>("Beta"));

    services.AddFeatureManagement();
    // More services...
}

Middlewares

Los middlewares son muy similares a los filtros MVC ya que nos permiten manipular las peticiones y las respuestas. A diferencia de los filtros, estos no nos brindan acceso al contexto de MVC.

También podemos aplicar middlewares al pipeline utilizando Feature Flags.

Requerimiento

Continuando con el ejemplo anterior, tenemos un middleware AddBetaHeaderMiddleware que agrega la misma cabecera “Beta” que agregamos con el filtro MVC de la sección anterior.

public class AddBetaHeaderMiddleware
{
    private readonly RequestDelegate _next;

    public AddBetaHeaderMiddleware(RequestDelegate next) =>
        _next = next;

    public async Task InvokeAsync(HttpContext context)
    {
        context
            .Request
            .Headers
            .Add("X-Version", "Beta");

        await _next(context);
    }
}

Necesitamos aplicar este middleware solo y solo si el Feature Flag "Beta" se encuentra activo.

Implementación

Para aplicar este filtro, tendremos que modificar el método Configure de la clase Startup, donde utilizaremos el método de extensión ya provisto por el framework UseMiddlewareForFeature<>().

public void Configure(
    IApplicationBuilder app,
    IWebHostEnvironment env)
{
    // More middlewares...

    app.UseMiddlewareForFeature<AddBetaHeaderMiddleware>("Beta");

    app.UseEndpoints(endpoints => {/**/});
}

El orden de los factores sí altera el producto

Tener en cuenta que los middlewares se ejecutan en el orden en el que se agregan. De modo tal, si en el ejemplo anterior registramos el middleware después de app.UseEndpoints(), el Feature Flag no funcionaría.

Conclusión

Paso a paso vamos descubriendo todo el potencial de los Feature Flags y como utilizarlos para lograr un desarrollo realmente ágil e incremental. En este post aplicamos middlewares y filtros.

En el próximo post iremos un poquito mas a fondo e implementaremos un Feature Flag personalizado.