如何在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" />
微软已经围绕。net中包含的HttpContext
、HttpRequest
和HttpResponse
构建了很棒的包装器和抽象,所以我肯定会直接使用它们,而不是自己包装。
你可以使用InjectionFactory
为HttpContextBase
配置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)));
您可以轻松地在单元测试中模拟HttpContextBase
、HttpRequestBase
和HttpResponseBase
,而不需要自定义包装器。
我不会直接依赖于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>();