Лучшая практика для доступа к сеансу HttpContext вне контроллера в отдельном вспомогательном классе - PullRequest
3 голосов
/ 11 июня 2011

Это хорошая практика для доступа к сеансу 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 -

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 Ответ

1 голос
/ 11 июня 2011

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

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


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

    • Ускорение разработки

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


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

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

    • Необходимо "заново изобрести колесо" в отношении доступа к HttpContext

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


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

Однако личноЯ бы выбрал путь, для написания которого требуется намного меньше кода.


Отредактировано для добавления

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

...