2008-12-02 26 views
5

Estoy tratando de encontrar la forma de pasar el contexto http actual de la web a una clase de servicio (o inicializar la clase con una referencia). Estoy haciendo esto para abstraer el resto de la aplicación de la necesidad de saber algo sobre el contexto http.Pasar el contexto web a un 'servicio' en la aplicación ASP MVC

También quiero que el servicio sea comprobable usando TDD, probablemente utilizando uno de los frameworks de Mockable. Por lo tanto, sería preferible usar una interfaz en lugar de una clase real.

Un ejemplo de lo que me gustaría lograr:

class WebInstanceService 
{ 
    private IHttpContext _Context;   

    public WebInstanceService(... , IHttpContext HttpContext) 
    { 
     .... 
     _Context = HttpContext; 
    } 

    // Methods... 
    public string GetInstanceVariable(string VariableName) 
    { 
     return _Context.Current.Session[VariableName]; 
    } 
} 

Uno de los principales problemas que tengo es que no hay IHttpContext, el contexto .net http es una subclase de una clase abstracta que puede No te burles (¿es fácil?).

Otro problema es que no puedo inicializar instancias globales de la clase porque el contexto no será relevante para la mayoría de las solicitudes.

que podría hacer la clase estática, y requieren el contexto que se pasa a cada función como se le llama, es decir

public static string GetInstanceVariable(string VariableName, HttpContext Context) 
{ ... } 

pero esto no hace que la clase más fácil de probar, todavía necesito cree un HttpContext y, además, cualquier servicio que no sea compatible con la web que desee utilizar esta clase de repente debe poder recuperar el contexto que requiere que esté estrechamente acoplado al servidor web; todo el motivo para querer crear esta clase en el primer lugar.

Estoy abierto a TODAS las sugerencias, especialmente aquellas que las personas saben que facilitan las pruebas fáciles de tdd. ¿Cómo me sugieren las personas que aborde este problema?

Saludos

Respuesta

3

Esta es la razón por HttpContextBase y HttpContextWrapper se introdujeron. Probablemente desee utilizar HttpContextBase y al pasar el contexto real, use new HttpContextWrapper(httpContext), aunque, creo que lo que está disponible para usted en el controlador ya es de tipo HttpContextBase. Crearía uno de estos en mi controlador cada vez en lugar de intentar hacer referencia al contexto actual desde la instancia estática y global de HttpContext.Current. Si lo necesita a su vista, pase una referencia a su contexto fuertemente tipado en ViewData.

Me burlo de HttpContextBase con frecuencia en mis pruebas.

class WebInstanceService 
{ 
    private HttpContextBase _Context;   

    public WebInstanceService(... , HttpContextBase HttpContext) 
    { 
     .... 
     _Context = HttpContext; 
    } 

    // Methods... 
    public string GetInstanceVariable(string VariableName) 
    { 
     return _Context.Session[VariableName]; 
    } 
} 
1

ASP.NET viene con System.Web.Abstracciones que incluyen HttpContextBase que puede usar para manejar el HttpContext en una situación de prueba.

Resumiría personalmente la dependencia directa del HttpContext.

+0

Esto es exactamente lo que trato de hacer, no quiero que los servicios de mi aplicación tengan que preocuparse por acceder a la sesión para recuperar datos, preferiría que fueran a través de la clase WebInstanceService. – Ash

+0

Me gustaría cuestionar incluso WebInstanceService. ¿El servicio necesita saber que es de la web? –

Cuestiones relacionadas