如何在Unity中实现这个(HttpContext)依赖?

时间:2011-11-01 14:49:00

标签: c# asp.net inversion-of-control unity-container httpcontext

我们有一个依赖于HttpContext的类。 我们已经像这样实现了它:

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

现在我要做的是通过SiteVariation实例化Unity类,这样我们就可以创建一个构造函数。 但我不知道如何以配置方式在Unity中配置这个新的HttpContextWrapper(HttpContext.Current))

PS 这是我们使用的配置方式

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

2 个答案:

答案 0 :(得分:32)

Microsoft已经围绕.NET中包含的HttpContextHttpRequestHttpResponse构建了很好的包装和抽象,所以我肯定会直接使用它们而不是自己包装它们。

您可以使用HttpContextBaseInjectionFactory配置Unity,如下所示:

var container = new UnityContainer(); 

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

此外,如果您需要HttpRequestBase(我倾向于使用最多)和HttpResponseBase,您可以像这样注册:

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

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

您可以在没有自定义包装器的单元测试中轻松模拟HttpContextBaseHttpRequestBaseHttpResponseBase

答案 1 :(得分:11)

我不会直接依赖HttpContextBase。我会在它周围创建一个包装器,并使用你需要的位:

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

然后执行:

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
}

这样,你的类现在只依赖于一个包装器,并且不需要实际的HttpContext来运行。使注入更容易,更容易测试:

public SiteVariation(IHttpContextBaseWrapper context)
{

}

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