Мы решили использовать функциональность внедрения зависимостей ASP. Net Core, так как она казалась идеально подходящей для работы. Для доступа к сеансу внутри службы необходим IHttpContextAccessor . Как указано в ASP. NET Core Diagnosti Дэвида Фаулера c Scenar ios, рекомендуется не хранить IHttpContextAccessor.HttpContext
в поле, однако использование службы должно уменьшить эту проблему , поскольку для каждого запроса создается .
Наша установка
Здесь мы используем HttpContextAccessor
для ссылки на текущий сеанс. Доступ к сеансу ограничен использованием свойств (строки могут быть в дальнейшем заменены константами).
public class SessionService
{
private readonly ISession _session;
public SessionService(IHttpContextAccessor accessor)
{
_session = accessor.HttpContext.Session;
}
public string Username
{
get { return _session.GetString("username"); }
set { _session.SetString("username", value); }
}
}
Оболочка сеанса затем настраивается как служба с областью действия в Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
// ...
// Register the service we use for session handling.
services.AddScoped<SessionService>();
}
И последнее, но не менее важное: сервис внедряется в нашу модель страницы и используется для доступа к сеансу через его свойство.
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
private readonly SessionService _session;
public IndexModel(ILogger<IndexModel> logger, SessionService session)
{
_logger = logger;
_session = session;
}
public void OnPost()
{
// Set the session variable.
_session.Username = "foo@bar";
}
}
Я публикую ответ в надежде получить отзыв о моем решении. а также предоставление ориентира для других, борющихся с этим.