Лучшие практики, чтобы получить доступ к сессии объект 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 ответ:
Очевидно, вы хотите иметь некоторую тестируемость в своем коде (в конце концов, именно поэтому вы проходите через бремя создания
ISessionWrapper
).Оба подхода имеют свои взлеты и падения.
Использование HttpContext напрямую
Быстрее развиваться
Нужны некоторые мысли о тестировании класса. Немелика возможность эмулировать HttpContext. Выполнимо с библиотекой, доступной в сети.
Использование инъекция зависимостей (ISessionWrapper):
Медленнее развиваться
Нужно "изобрести колесо" относительно доступа к HttpContext
Гораздо больше кода для написания и сохранения
Таким образом, я бы обдумал плюсы и минусы обоих подходов и принял решение в зависимости от моих целей. Однако лично я бы выбрал путь, который требует гораздо меньше кода для написания.
Отредактировано до Добавить
В ответ на суть вопроса (после ворчания со стороны ОП) контроллер должен всегда управлять сбором данных, прежде чем передавать их исполнительным устройствам.