Получить/Установить методы сеанса HttpContext в BaseController vs Mocking HttpContextBase для создания методов Get/Set
Я создал методы Get/Set HttpContext Session в классе BaseController, а также Mocked HttpContextBase и создал методы Get/Set.
Каков наилучший способ его использования.
HomeController : BaseController
{
var value1 = GetDataFromSession("key1")
SetDataInSession("key2",(object)"key2Value");
Or
var value2 = SessionWrapper.GetFromSession("key3");
GetFromSession.SetDataInSession("key4",(object)"key4Value");
}
public class BaseController : Controller
{
public T GetDataFromSession<T>(string key)
{
return (T) HttpContext.Session[key];
}
public void SetDataInSession(string key, object value)
{
HttpContext.Session[key] = value;
}
}
Или
public class BaseController : Controller
{
public ISessionWrapper SessionWrapper { get; set; }
public BaseController()
{
SessionWrapper = new HttpContextSessionWrapper();
}
}
public interface ISessionWrapper
{
T GetFromSession<T>(string key);
void SetInSession(string key, object value);
}
public class HttpContextSessionWrapper : ISessionWrapper
{
public T GetFromSession<T>(string key)
{
return (T) HttpContext.Current.Session[key];
}
public void SetInSession(string key, object value)
{
HttpContext.Current.Session[key] = value;
}
}
Ответы
Ответ 1
Второй кажется лучшим. Хотя я бы, вероятно, написал эти два метода расширения HttpSessionStateBase вместо того, чтобы помещать их в базовый контроллер. Вот так:
public static class SessionExtensions
{
public static T GetDataFromSession<T>(this HttpSessionStateBase session, string key)
{
return (T)session[key];
}
public static void SetDataInSession<T>(this HttpSessionStateBase session, string key, object value)
{
session[key] = value;
}
}
а затем внутри контроллеров или помощников или что-то, что имеет экземпляр HttpSessionStateBase
, используйте его:
public ActionResult Index()
{
Session.SetDataInSession("key1", "value1");
string value = Session.GetDataFromSession<string>("key1");
...
}
Написание сеансовых оберток бесполезно в ASP.NET MVC, поскольку HttpSessionStateBase
, предоставляемый инфраструктурой, уже является абстрактным классом, который можно легко высмеять в модульных тестах.
Ответ 2
Небольшая коррекция метода SetDataInSession последнего сообщения. На мой взгляд, это элегантное решение! Спасибо Дарин Димитров.
public static class SessionExtensions
{
public static T GetDataFromSession<T>(this HttpSessionStateBase session, string key) {
return (T)session[key];
}
public static void SetDataInSession(this HttpSessionStateBase session, string key, object value) {
session[key] = value;
}
}
-
Сначала создайте этот класс и не забудьте указать его пространство имен в классе Controller, которое вызовет эти методы.
-
При получении значения сеанса:
string value = Session.GetDataFromSession<string>("key1");
Должен быть совместимым типом с объектом, сохраненным в сеансе.