7

tenemos una clase con una dependencia al HttpContext. Hemos implementado de esta manera:¿Cómo implementar esta dependencia (HttpContext) en Unity?

public SiteVariation() : this(new HttpContextWrapper(HttpContext.Current)) 
{ 
} 
public SiteVariation(HttpContextBase context) 
{} 

Ahora lo que quiero hacer es crear una instancia de la clase a través de SiteVariationUnity, para que podamos crear un constructor. Pero no sé cómo configurar este nuevo HttpContextWrapper(HttpContext.Current)) en Unity en la forma de configuración.

ps esta es la forma de configuración que utilizamos

<type type="Web.SaveRequest.ISaveRequestHelper, Common" mapTo="Web.SaveRequest.SaveRequestHelper, Common" /> 

Respuesta

11

no llevar a una dependencia de HttpContextBase directamente. En vez de ello crear una envoltura alrededor de ella, y el uso de los bits que necesita:

public interface IHttpContextBaseWrapper 
{ 
    HttpRequestBase Request {get;} 
    HttpResponseBase Response {get;} 
    //and anything else you need 
} 

entonces la aplicación:

public class HttpContextBaseWrapper : IHttpContextBaseWrapper 
{ 
    public HttpRequestBase Request {get{return HttpContext.Current.Request;}} 
    public HttpResponseBase Response {get{return HttpContext.Current.Response;}} 
    //and anything else you need 
} 

esta manera, su clase ahora sólo se basa en una envoltura, y no lo hace necesita el HttpContext real para funcionar. Hace que sea mucho más fácil de inyectar, y mucho más fácil de prueba:

public SiteVariation(IHttpContextBaseWrapper context) 
{ 

} 

var container = new UnityContainer(); 
container.RegisterType<IHttpContextBaseWrapper ,HttpContextBaseWrapper>(); 
+0

Agradable. Estaba preocupado por el envoltorio porque todo parece ir bien en estos días, pero en este caso parece uno bueno. – Michel

+1

Acerca del "todo parece ir bien estos días": escuché a alguien decir: cada año agregamos nuevas envolturas alrededor del código de mierda que hemos creado el año pasado. Esto no tiene nada que ver con la respuesta, que es buena, pero simplemente surgió :-) – Michel

+4

@Michel: Hay mucha verdad en esa afirmación. Con DI/IoC siendo el sabor del día, he estado escribiendo envoltorios alrededor de un montón de código "heredado" (código que en algunos casos no es más antiguo que un par de años) para hacerlo más comprobable. En este momento se siente como lo correcto. Dentro de 3 años, todos estaremos diciendo "¡¡Hombre, WTF, estábamos pensando con todas esas interfaces únicas !!" – BFree

24

Microsoft ya ha construido grandes envoltorios y abstracciones alrededor HttpContext, HttpRequest y HttpResponse que se incluye en .NET así que sin duda utilizar los directamente en lugar de envolver yo mismo.

Puede configurar la unidad para HttpContextBase utilizando InjectionFactory, así:

var container = new UnityContainer(); 

container.RegisterType<HttpContextBase>(new InjectionFactory(_ => 
    new HttpContextWrapper(HttpContext.Current))); 

Además, si necesita HttpRequestBase (que tienden a utilizar la mayoría) y HttpResponseBase, puede registrarse como esto:

container.RegisterType<HttpRequestBase>(new InjectionFactory(_ => 
    new HttpRequestWrapper(HttpContext.Current.Request))); 

container.RegisterType<HttpResponseBase>(new InjectionFactory(_ => 
    new HttpResponseWrapper(HttpContext.Current.Response))); 

puede burlarse fácilmente HttpContextBase, HttpRequestBase y HttpResponseBase en las pruebas unitarias y sin envoltorios personalizados.

+2

Su respuesta es excelente, así que esta es una alternativa puramente estilística: como usted está devolviendo un objeto simple en una lamda, no necesita un bloque de código formal. Entonces, simplemente puede escribirlo en una línea: container.RegisterType (nueva InjectionFactory (c => new HttpContextWrapper (HttpContext.Corriente))); – BlackjacketMack

+2

@BlackjacketMack ¡Gracias! Sí, me gusta eso mejor. He actualizado la respuesta con esto. Para seguir la convención, también actualicé para usar guion bajo para indicar que el parámetro no se usa. –

+2

Agradable. ¡Es la primera vez que veo la convención del subrayado, pero me gusta! Muy comunicativo – BlackjacketMack

Cuestiones relacionadas