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

本文关键字:HttpContext 依赖 实现 Unity | 更新日期: 2023-09-27 18:13:04

我们有一个依赖于HttpContext的类。我们是这样实现的:

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

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

ps这是我们使用

的配置方式
<type type="Web.SaveRequest.ISaveRequestHelper, Common" mapTo="Web.SaveRequest.SaveRequestHelper, Common" />

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

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

你可以使用InjectionFactoryHttpContextBase配置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,而不需要自定义包装器。

我不会直接依赖于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>();