我们有一个依赖于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" />
答案 0 :(得分:32)
Microsoft已经围绕.NET中包含的HttpContext
,HttpRequest
和HttpResponse
构建了很好的包装和抽象,所以我肯定会直接使用它们而不是自己包装它们。
您可以使用HttpContextBase
为InjectionFactory
配置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
。
答案 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>();