Лучшие практики, чтобы получить доступ к сессии объект HttpContext вне контроллера в отдельный вспомогательный класс


Является ли хорошей практикой доступ к сеансу HttpContext вне контроллера в отдельном вспомогательном классе?

====================

Должен ли контроллер взять на себя всю ответственность за получение данных из сеанса и передачу их в вспомогательный класс

Пример

HomeController : BaseController
{
    var value1 = Httpcontext.Session["key1"];
    var value2 = Httpcontext.Session["key2"];
    var val...
    CallAMethod(value1,value2,val...);
}

Или он должен имитировать HttpContextBase и использовать его, как показано ниже?

HomeController : BaseController
{
    //Use Dependency Injection pattern
    CallAMethod(base.SessionWrapper);
}

Реализация ISessionWrapper is

public interface ISessionWrapper
{
     T GetFromSession<T>(string key);
     SetInSession(string key, object value);
}

public class HttpContextSessionWrapper : ISessionWrapper
{
   private T GetFromSession<T>(string key)
   {
      return (T) HttpContext.Session[key];
   }

   private void SetInSession(string key, object value)
   {
      HttpContext.Session[key] = value;
   }
}

public class BaseController : Controller
{
   public ISessionWrapper SessionWrapper { get; set; }

   public BaseController()
   {
      SessionWrapper = new HttpContextSessionWrapper();
   }
}
1 3

1 ответ:

Очевидно, вы хотите иметь некоторую тестируемость в своем коде (в конце концов, именно поэтому вы проходите через бремя создания ISessionWrapper).

Оба подхода имеют свои взлеты и падения.


  • Использование HttpContext напрямую

    • Быстрее развиваться

    • Нужны некоторые мысли о тестировании класса. Немелика возможность эмулировать HttpContext. Выполнимо с библиотекой, доступной в сети.


  • Использование инъекция зависимостей (ISessionWrapper):

    • Медленнее развиваться

    • Нужно "изобрести колесо" относительно доступа к HttpContext

    • Гораздо больше кода для написания и сохранения


Таким образом, я бы обдумал плюсы и минусы обоих подходов и принял решение в зависимости от моих целей. Однако лично я бы выбрал путь, который требует гораздо меньше кода для написания.

Отредактировано до Добавить

В ответ на суть вопроса (после ворчания со стороны ОП) контроллер должен всегда управлять сбором данных, прежде чем передавать их исполнительным устройствам.