Я внедряю свой собственный класс ApplicationContext, который использует шаблон синглтона. Я хочу сохранить свой экземпляр в HttpContext.Items, поскольку он доступен во всех частях запроса. Я читал об использовании HttpContext с ASP.NET MVC, и одна из основных проблем заключается в том, что он представляет сложность тестирования. Я пытался исследовать тестируемость HttpContext.Items, но все, что я могу найти, - это материал на Session Единственное, что я нашел, - это пример главы в книге Professional ASP.NET 3.5 MVC по Wrox ( pdf ссылка здесь ). На странице 15 говорится следующее:
Что-то, что вы не можете использовать: HttpContext.Items
Выше в этом разделе мы пришли к выводу, что солгали вам: HttpContext не является общим для ASP.NET MVC и ASP.NET Web Forms. В результате этого вы не можете использовать коллекцию HttpContext.Items для хранения и извлечения битов данных.
Причина этого заключается в том, что после перенаправления на контроллер ваш HttpHandler становится System.Web.Mvc.MvcHandler, который создается с использованием HttpContextWrapper, который будет иметь свое собственное определение HttpContext.Current. К сожалению, во время этого рукопожатия такие вещи, как HttpContext.Items не передаются.
Это сводится к тому, что типы HttpContext, несмотря на то, что они выглядят и звучат практически одинаково, не одинаковы, и вы не можете передавать данные таким образом.
Теперь я попытался проверить это, и, насколько я могу судить, если вы перенаправляете на другой контроллер с помощью RedirectToAction, HttpContext.Items остается. Я использую проект ASP.NET MVC по умолчанию, чтобы проверить это. Что я сделал, добавьте этот метод в Global.asax.cs:
protected void Application_BeginRequest()
{
Context.Items["Test"] = "Hello World";
}
А в HomeController.cs я изменил метод Index на:
public ActionResult Index()
{
return RedirectToAction("About");
}
И изменил метод About на:
public ActionResult About()
{
Response.Write(Convert.ToString(HttpContext.Items["Test"]));
return View();
}
Когда я запускаю приложение, страница правильно перенаправляется в / Home / About и Response.Написывает правильную строку «Hello World», установленную в global.asax.cs.
Итак, мне кажется, что я либо не понимаю, что означает книга, когда они говорят
«такие вещи, как HttpContext.Items не передаются» ИЛИ он действительно передает эти вещи, и можно использовать HttpContext.Items.
Если вы, ребята, порекомендуете мне избегать HttpContext.Items, есть ли другой альтернативный способ хранения объекта в запросе для каждого запроса?