Me acabo de topar con este mismo problema, pero mi solución es algo diferente.
Interfaz:
public interface IHttpContextProvider
{
/// <summary>
/// Gets the current HTTP context.
/// </summary>
/// <value>The current HTTP context.</value>
HttpContextBase Current { get; }
}
Implementación:
/// <summary>
/// A default HTTP context provider, returning a <see cref="HttpContextWrapper"/> from <see cref="HttpContext.Current"/>.
/// </summary>
public class DefaultHttpContextProvider : IHttpContextProvider
{
public HttpContextBase Current
{
get { return new HttpContextWrapper(HttpContext.Current); }
}
}
entonces registrar el IHttpContextProvider
como un singleton en el recipiente. Todavía soy un poco novato cuando se trata de DI, así que tal vez estoy complicando las cosas, pero por lo que puedo entender, no puedo tener ningún componente único que dependa de los componentes de estilo de vida de PerWebRequest, lo cual tiene sentido (pero eso es lo que hacen todos los ejemplos). En mi solución, dependo de HttpContext.Current
en un componente aislado y no estoy interesado en probar eso. Pero cada componente que necesita acceso al contexto HTTP puede obtener eso dependiendo de IHttpContextProvider
y simularlo fácilmente según sea necesario.
¿Realmente estoy complicando las cosas o hay alguna advertencia en mi solución?
Mark, gracias por la información - No sabía acerca de PerWebRequest. Lo comprobaré. –
Mark, he investigado PerWebRequest, pero todavía no veo cómo los servicios pueden obtener HttpContext. Cuando trato de registrar una instancia de HttpContextBase en el contenedor yo mismo, falla después de la segunda solicitud (ya que una instancia ya estaba registrada en la solicitud anterior). Hasta ahora no he podido encontrar nada en Google ... –
Pude haber entendido mal lo que está intentando hacer, pero no puede usar HttpContext desde Application_Start porque en este punto * no * hay HttpContext (PerWebRequest o no PerWebRequest)) Ahora que lo pienso, no tiene sentido intentar controlar la vida útil de HttpContext desde DI Container, ya que esta vida ya está siendo administrada por el framework ASP.NET MVC.Lo que * puede * hacer es engancharse en una IControllerFactory personalizada y tomar el HttpContext que se le sirvió en ese momento, y luego usar un método de fábrica para conectar todo lo demás que dependa de él. –