При работе с Razor Pages и классом Page Model вызывается конструктор при каждом запросе? - PullRequest
0 голосов
/ 01 октября 2019

Я столкнулся с проблемой понимания жизненного цикла класса Page Model для использования в Razor Pages. Я пытаюсь подумать о том, как и когда обращаться с общими данными, которые я передаю своей бизнес-логике, такой как userId, который выполняет запрос. Мне столько раз нужно было сохранять эту информацию с результатами действия.

Так, где лучшее место для того, чтобы снова и снова обрабатывать что-то, например, получать данные пользователя, которые могут быть в модели постоянства, а не в контекстепользователя модели страницы из HTTPContext?

Следует отметить, что я использую теги авторизации с аутентификацией на основе файлов cookie для веб-службы.

1 Ответ

0 голосов
/ 02 октября 2019

Для доступа к Reuqest из других слоев, кроме Razor Page, вы можете попробовать IHttpContextAccessor.

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

public interface IUserService
{
    IdentityUser GetUser();
}

public class UserService:IUserService
{
    private readonly ApplicationDbContext _context;
    private readonly HttpContext _httpContext;

    public UserService(ApplicationDbContext context
        , IHttpContextAccessor httpContextAccessor)
    {
        _context = context;
        _httpContext = httpContextAccessor.HttpContext;
    }
    public IdentityUser GetUser()
    {
        StringValues userId = "";
        if (_httpContext.Request.Headers.TryGetValue("userId", out userId))
        {
            var user = _context.Users.FirstOrDefault(u => u.Id == userId);
            return user;
        }
        else
        {
            return null;
        }
    }
}

А затем зарегистрируйтесь как

    services.AddScoped<IUserService, UserService>();

Затем вы можете разрешить IUserService из DI, чтобы использовать их, когда вы хотите получить доступ к информации о пользователе.

public class IndexModel : PageModel
{
    private readonly IUserService _userService;

    public IndexModel(IUserService userService)
    {
        _userService = userService;
    }

    public void OnGet()
    {
        var user = _userService.GetUser();
    }
}
...