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

Я могу успешно выполнить серверный код через HTTP-запросы в ASP .NET Core, но не могу сохранить информацию в модели между запросами.

Я надеялся, что переключение с частной переменной на службу, созданную с помощью среды внедрения зависимостей ASP NET Core, решит мою проблему, но, увы, нет.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Earley_Parser.Language;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.ViewFeatures;

namespace Storyteller.Pages.EarleyParser {
    public class IndexModel : PageModel {
        public readonly IGrammar _grammarContext;

        public IndexModel(IGrammar grammarContext) {
            _grammarContext = grammarContext;
        }

        [HttpGet]
        public IActionResult OnGet() {
            _grammarContext.Add(new GrammarRule("", "S"));
            _grammarContext.Add(new GrammarRule("A", "S"));
            _grammarContext.Add(new GrammarRule("AA", "A"));
            _grammarContext.Add(new GrammarRule("a", "A"));
            return Page();
        }

        [HttpPost]
        public IActionResult OnPostAdd(String grammar_addRule_from, String grammar_addRule_to) {
            _grammarContext.Add(new GrammarRule(grammar_addRule_to, grammar_addRule_from));

            return new PartialViewResult {
                ViewName = "_ContextFreeGrammar",
                ViewData = new ViewDataDictionary<Grammar_2>(ViewData, _grammarContext)
            };
        }

        [HttpPost]
        public IActionResult OnPostRemove(Int32 id) {
            _grammarContext.Remove(_grammarContext.ElementAt(id));

            return new PartialViewResult {
                ViewName = "_ContextFreeGrammar",
                ViewData = new ViewDataDictionary<Grammar_2>(ViewData, _grammarContext)
            };
        }

        [HttpPost]
        public IActionResult OnPostUpdateStart(Char grammar_start) {
            _grammarContext.Start = grammar_start;

            return new PartialViewResult {
                ViewName = "_ContextFreeGrammar",
                ViewData = new ViewDataDictionary<Grammar_2>(ViewData, _grammarContext)
            };
        }
    }
}

Мой идеальный сценарий - когда страница загружается, инициализируется _grammarContext, а последующие HTTP-запросы изменяют состояние _grammarContext. Этот сценарий на самом деле происходит однако, перед выполнением любого HTTP-запроса

IndexModel(IGrammar grammarContext)

вызывается, и _grammarContext получает сброс своего состояния посредством внедрения зависимости. Как я могу остановить этот сброс?

1 Ответ

0 голосов
/ 25 апреля 2019

Вам необходимо зарегистрировать свой сервис с единственным сроком службы:

services.AddSingleton<IGrammarContext, GrammarContext>();

Таким образом, только один экземпляр будет создан для жизни приложения, и тот же самый экземпляр будет вводиться каждый раз.

Тем не менее, следует избегать использования времени жизни синглтона. Поскольку ваш класс здесь очень простой, он управляет только списком в памяти, это не слишком проблематично, но в более сложных сценариях использование синглетонов может связать вас и поощрить другие плохие практики, такие как сервис-локатор.

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