HttpContext es nulo cuando se llama a Ninject fuera de un controlador MVC3

esta pregunta Inyección de dependencia Ninject en MVC3 - Fuera de un controlador está cerca de lo que estoy experimentando, pero no del todo.

Tengo un sitio ASP.NET MVC3 que usa Ninject 3 y funciona de maravilla con la inyección de constructor. Todas mis dependencias están resueltas, incluidas las que pasan en HttpContext.Current.

Mi problema es que en global.asax, inicio una clase TaskManager que periódicamente realiza algunas tareas en un temporizador. Dentro de la clase TaskManager, no tengo controladores, por lo que si necesito acceder a una de mis dependencias (como mi servicio de registro de errores), uso una clase contenedora estática que tiene acceso al objeto del kernel:

var logger = MyContainer.Get<ILoggingService>();
logger.Error("error doing something...", ex);

El método .Get simplemente realiza una llamada kernel.Get para resolver mi dependencia. Funciona muy bien cada vez que uso este método en mis otras dependencias. Sin embargo, ILoggingService tiene una dependencia llamada MyWebHelper que se inyecta a través de su constructor e incluye HttpContext en su constructor.

    public class DefaultLogger : ILoggingService
    {     
        public DefaultLogger(IRepository<Log> logRepository, IWebHelper webHelper)
        {
            _logRepository = logRepository;
            _webHelper = webHelper;
       }
    }

    public class MyWebHelper : IWebHelper
    {
      public MyWebHelper(HttpContext httpContext)
      {
          _httpContext = httpContext;
      }
    }

En el resto de mi sitio web, todo esto funciona bien porque todas las dependencias se inyectan en mis controladores MVC. Pero lo que no funciona es si llamo manualmente a mi clase contenedora estática para obtener mis dependencias de esa manera. me sale el error:

Error al activar HttpContext usando el enlace de HttpContext al método

El proveedor devolvió nulo.

Entonces, no me está dando un HttpContext como lo hace en el resto de mi aplicación MVC. Espero que esto tenga sentido, todavía no soy un experto en ninjects, pero estoy intentando...

preguntado el 12 de junio de 12 a las 22:06

1 Respuestas

Mi problema es que en global.asax, inicio una clase TaskManager que periódicamente realiza algunas tareas en un temporizador.

Esa es una mala idea como Phil Haack explica en detalles. No hagas esto en tu aplicación web. Esas tareas recurrentes deben realizarse en una aplicación separada (Servicio de Windows o alguna aplicación de consola que esté programada para ejecutarse a intervalos regulares).

Ahora la cosa es que estás ejecutando subprocesos en segundo plano. Esos subprocesos en segundo plano se ejecutan fuera de cualquier solicitud HTTP del usuario y, como consecuencia HttpContext.Current es obviamente nulo dentro de ellos. Entonces, incluso si no sigue los consejos de Phil Haack y continúa ejecutando tareas en segundo plano en su aplicación ASP.NET, tendrá que reestructurar su método para que ya no dependa de ningún HttpContext porque no existe tal cosa en esos subprocesos en segundo plano.

Respondido el 13 de junio de 12 a las 07:06

¡Gracias por tu publicación! Las tareas que realizo son en su mayoría tareas de tipo limpieza y envío de correos electrónicos que han estado en cola. NopCommerce hace algo muy similar, que es de donde saqué la idea. Son muy cortos y sencillos. Entiendo el comentario sobre HttpContext. Por supuesto, eso no está disponible :) Mi forma de evitar esto fue crear otra versión de ILoggingService que no tuviera dependencias inyectadas que incluyeran HttpContext.Current. Sería genial si no explotara cuando encontrara un HttpContext nulo. - ScottG

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.