Leer variables Session desde una capa de Negocios

En una reciente conversación en los foros de ms, desempolvé una vieja utilidad que en más de una ocasión me ha salvado de un apuro y que, aunque no tenía en el olvido, reconozco que no le di la importancia que tenía hasta que comprendí que mucha gente tiene los mismos problemas que tengo yo. Al fin y al cabo siempre pienso que soy más torpe que los demás y que lo que a mí me cuesta mucho rato desarrollar, el resto lo resuelven a la primera. Bueno, intento comentarlo con un ejemplo, que siempre es más ilustrativo:4

Una aplicación con dos capas y media (realmente son tres, pero como no viene al caso, intento abstraerme de la capa de datos). Una capa de presentación separada físicamente de la capa de negocios, es decir, en proyecto diferente. Con una aplicación a medio crear, de buenas a primeras nos damos cuenta que será mejor almacenar en tablas quién es el usuario que ha tocado el registro y cuál es la fecha de dicho cambio. Con respecto a la fecha no existe mucho problema pero si nos fijamos en el nombre del usuario apreciamos que está en la capa de presentación y no llega a la capa de negocios. ¿Qué hacemos en este caso?. Una de las opciones que no nos gusta a ningún desarrollador es la de modificar todos los procedimientos de datos, incluyendo el nombre del usuario en ellos. Con esta opción, seguro que nos dejamos alguna página o procedimiento sin actualizar…

¿Qué opción debemos tomar entonces?. Algo tan sencillo como hacer uso de la variable Session desde la capa de negocios. En algún foro creo haber leído el concepto de “Encapsular las variables Session” o “Añadir Intellisense a las variables de Session”. No sé cuál sería la nomenclatura adecuada pero creo que ambas tienen su parte de razón. Veamos el código:

   1: /// <summary>
   2: /// Obtiene o establece el nombre del usuario actual.
   3: /// </summary>
   4: public static string UserWeb
   5: {
   6:     get
   7:     {
   8:         if (System.Web.HttpContext.Current.Session["userName"] == null)
   9:             System.Web.HttpContext.Current.Session["userName"] = "unknown";
  10:         return System.Web.HttpContext.Current.Session["userName"].ToString();
  11:     }
  12:     set { System.Web.HttpContext.Current.Session["userName"] = value; }
  13: }

Si esta propiedad la introducimos dentro de la capa de negocios (se sobreentiende que en un proyecto diferente de la de presentación) podremos conseguir un “intellisense” de las variables de Session a la vez que estamos “encapsulando” las variables de sesión. Se cual sea su nomenclatura, nos servirá para poder tener una misma variable desde la capa de presentación como desde la capa de negocios que, al fin y al cabo era el objetivo buscado.