Ответ обычно таков: нет.
В ASP.NET Core вы в значительной степени избегаете статического кода.Вместо этого ASP.NET Core использует внедрение зависимостей , чтобы сделать службы доступными в качестве зависимостей и управлять их временем жизни.
Статический служебный класс в ASP.NET, вероятно, будет преобразован в одноэлементную службу в ASP.NET Core.Использовать это очень просто;вы начинаете с создания нестатического сервиса, который делает все, что вы хотите.Поскольку здесь используется внедрение зависимостей, вы можете просто зависеть и от других сервисов:
public class MyService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public MyService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void SetSomeSessionValue(string value)
{
var httpContext = _httpContextAccessor.HttpContext;
httpContext.Session["example"] = value;
}
}
Вы можете делать там все, что захотите.IHttpContextAccessor
используется для получения текущего HttpContext.
Затем вам необходимо зарегистрировать свой сервис в контейнере внедрения зависимостей.Вы делаете это с помощью метода ConfigureServices
в вашем Startup.cs
:
services.AddSingleton<MyService>();
// we also add the HttpContextAccessor, in case it wasn’t already (implicitly) registered before
services.AddHttpContextAccessor();
И теперь вы можете зависеть от этого MyService
в контроллерах или других сервисах, просто добавив его в качестве аргумента конструктора:
public class HomeController
{
private readonly MyService _myService;
public HomeController(MyService myService)
{
_myService = myService;
}
public IActionResult Index()
{
_myService.SetSomeSessionValue("test");
return View();
}
}
Теперь у вас есть нестатическая служба, которая имеет четкие зависимости и которую вы можете правильно протестировать.
Как уже говорилось, многие конструкции уже имеют доступ к текущейHttpContext
и как таковой для сессии.Например, в контроллерах, страницах Razor или даже в представлениях Razor вы можете просто получить прямой доступ к HttpContext
, так как это переменная instance .
Так что если вы не создаете какую-либо повторно используемуюкод утилиты, вам на самом деле не нужно создавать сервис для этого.Например, вы можете просто создать (нестатический) служебный метод в вашем контроллере, который затем получит прямой доступ к HttpContext
.