Пойдем дальше с ремонтопригодностью. Я процитирую мой другой ответ об использовании сеанса:
Допустим, мы хотим сохранить корзину покупок - это сессия нашего приложения ASP.NET MVC. Он будет храниться в Session["ShoppingCart"]
, но нам нужен простой, строго типизированный доступ и высокая тестируемость:
Сначала мы определим интерфейс:
public interface ISessionWrapper
{
List<CartItem> ShoppingCart { get; set; }
}
Затем мы делаем реализацию HttpContext:
public class HttpContextSessionWrapper : ISessionWrapper
{
private T GetFromSession<T>(string key)
{
return (T) HttpContext.Current.Session[key];
}
private void SetInSession(string key, object value)
{
HttpContext.Current.Session[key] = value;
}
public List<CartItem> ShoppingCart
{
get { return GetFromSession<List<CartItem>>("ShoppingCart"); }
set { SetInSession("ShoppingCart", value); }
}
}
GetFromSession и SetInSession - вспомогательный метод, упрощающий получение и настройку данных в Session. Их можно легко использовать для доступа к другим полям в сеансе.
Затем мы определяем наш базовый контроллер (применимый к ASP.NET MVC):
public class BaseController : Controller
{
public ISessionWrapper SessionWrapper { get; set; }
public BaseController()
{
SessionWrapper = new HttpContextSessionWrapper();
}
}
Если вы хотите использовать Session вне контроллера, вы просто создаете или внедряете новый HttpContextSessionWrapper ().
Вы можете заменить SessionWrapper на макет ISessionWrapper в тестах контроллера, чтобы он больше не зависел от HttpContext. Сеанс также более прост в использовании, потому что вместо вызова (List<CartItem>)Session["ShoppingCart"]
, вы звоните SessionWrapper.ShoppingCart
. Это выглядит лучше, не так ли?
Если вы не используете класс модели для представления, и я думаю, что использование класса модели лучше, вы можете сделать то же самое с ViewData:
public interface IViewDataWrapper
{
List<CartItem> ShoppingCart { get; set; }
}
public class ViewDataWrapper : IViewDataWrapper
{
}
public class BaseController : Controller
{
public IViewDataWrapper ViewDataWrapper { get; set; }
public BaseController()
{
IViewDataWrapper = new ViewDataWrapper();
}
}
А потом просто в контроллере:
ViewDataWrapper.ShoppingCart = SessionWrapper.ShoppingCart
или если вы решите не использовать ViewData и конкретную модель:
Model.ShoppingCart = SessionWrapper.ShoppingCart
И просто в представлении (если вы определяете базовый класс для представления и вводите этот интерфейс):
<%= ViewDataWrapper.ShoppingCart %>
или
<%= Model.ShoppingCart %>
Никаких опечаток, строго типизированных, симпатичных.