Как реализовать эту (HttpContext) зависимость в Unity? - PullRequest
8 голосов
/ 01 ноября 2011

у нас есть класс с зависимостью от HttpContext. Мы реализовали это так:

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

Теперь я хочу создать экземпляр класса SiteVariation с помощью Unity, чтобы мы могли создать один конструктор. Но я не знаю, как настроить этот новый HttpContextWrapper(HttpContext.Current)) в Unity в пути конфигурации.

п.с. это способ конфигурации, который мы используем

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

Ответы [ 2 ]

34 голосов
/ 22 марта 2014

Microsoft уже создала отличные обертки и абстракции вокруг HttpContext, HttpRequest и HttpResponse, которые включены в .NET, поэтому я определенно использовал бы их непосредственно, а не упаковывал их сам.

Вы можете настроить Unity для HttpContextBase, используя InjectionFactory, например:

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 в модульных тестах без пользовательских оболочек.

11 голосов
/ 01 ноября 2011

Я бы не взял зависимость от 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>();
...