HttpContext.Current.Items

Los que más y los que menos, sabemos lo que es el ciclo de vida de una llamada a una página ASP.NET. Los que no lo estén o quieran más info, les recomiendo este sencillo artículo. Durante el ciclo de vida, hacemos llamadas a clases, inicializamos controles, recogemos información de base de datos, llamamos a servicios Web, etc.

Es bastante común que en dos momentos puntuales del ciclo de vida de nuestra página queramos acceder a un mismo dato desde dos sitios diferentes. Por poner un ejemplo, podemos tener dos clases que acceden a un mismo método que, obligatoriamente, debe acceder a BBDD.

¿Y por qué tener que acceder dos veces a la BBDD en un mismo ciclo de vida si obtenemos el mismo resultado?
Una primera solución podría ser guardar ese dato en una variable de Session, una variable de Application o una variable de Cache, de modo que se puede acceder a ese dato en todo momento... pero aunque esas variables son muy útiles en ciertos momentos, no están hechas para guardar información que sólo es válida en el mismo ciclo de vida.

Pero vale ya de tanta explicación, y veamos un poco de código:

    public static string Valor
    {
        get
        {
            if (!HttpContext.Current.Items.Contains("Valor"))
            {
                HttpContext.Current.Items["Valor"] = NuestraClase.MetodoQueAccedeBBDD();
            }

            return HttpContext.Current.Items["Valor"].ToString();
        }
        set
        {
            HttpContext.Current.Items["Valor"] = value;
        }
    }


El Dictionary "HttpContext.Current.Items" guarda Items durante un mismo ciclo de vida. En nuestro ejemplo, cada vez que leemos la propiedad "Valor" vemos si en el Dictionary existe esa clave. Si no existe, accedemos a un método cualquiera que, como cuello de botella habitual, accede a la BBDD; y metemos el resultado en el Dictionary. De este modo, la próxima vez que accedamos a la propiedad dentro del mismo ciclo de vida de la página, no hará falta entrar en el método que accede a BBDD.

Este modo de trabajar puede ser realmente beneficioso. Yo me he encontrado con proyectos que llamaban hasta 10 veces a un método que tardaba medio segundo en acceder a BBDD y volver... lo que hacía un total de la friolera de 5 segundos!!!! Aplicando este método, rebajamos drásticamente 4,5 segundos.

De este modo, os aconsejo que reviséis vuestras Webs y analicéis dónde puede ser efectivo usar el HttpContext.Current.Items. Huelga decir que en nuestro ejemplo, trabajabamos con un simple "string", pero el Dictirionary "HttpContext.Current.Items" almacena "objects", de modo que podemos guardar absolutamente cualquier cosa .