Как я могу использовать переменные сеанса в статическом методе? - PullRequest
0 голосов
/ 02 июля 2019

Я использую ASP.NET Core. Как я могу использовать переменные сеанса в статическом методе?

В ASP.NET это выглядело так:

protected static string AssignSession()  
{
    return HttpContext.Current.Session["UserName"].ToString();
}

protected void Page_Load(object sender, EventArgs e)
{
    Session["UserName"] = "super user";
}

Когда я пытаюсь это сделать в ASP.NET Core, я получаю следующую ошибку:

Ссылка на объект требуется для нестатического поля, метода, или свойство 'ControllerBase.HttpContext'.

1 Ответ

4 голосов
/ 02 июля 2019

Ответ обычно таков: нет.

В 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...