Получить / установить методы сеанса HttpContext в BaseController против Mocking HttpContextBase для создания методов Get / Set

Я создал методы сеанса Get / Set HttpContext в классе 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;
       }
   }

Or

  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;
     }
  }

person Mangesh Pimpalkar    schedule 11.06.2011    source источник


Ответы (2)


Второй вариант кажется лучшим. Хотя я бы, вероятно, написал эти два метода расширения в 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, предоставляемый фреймворком, уже является абстрактным классом, который можно легко смоделировать в модульных тестах.

person Darin Dimitrov    schedule 11.06.2011
comment
Я исправил опечатку с помощью редактирования, но потом все ее отвергли. Посмотрим, сможешь ли ты его найти;) - person DukeDidntNukeEm; 30.12.2016

Небольшая поправка для метода 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;
        }
}
  • Сначала создайте этот класс, а затем не забудьте указать его пространство имен в классе контроллера, который будет вызывать эти методы.

  • При получении значения сеанса:

string value = Session.GetDataFromSession<string>("key1");

Тип должен быть совместимым с объектом, сохраняющимся в сеансе.

person Daniel Carvalho Melo    schedule 07.07.2011