我可以通过ASP .NET Core中的HTTP请求成功执行服务器端代码,但无法在请求之间的模型中存储信息。
我希望从私有变量切换到通过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通过依赖项注入重置其状态。如何停止这种重置?
答案 0 :(得分:0)
您需要在单身有效期内注册您的服务:
services.AddSingleton<IGrammarContext, GrammarContext>();
这样,在应用程序的整个生命周期内将只创建一个实例,并且每次都将注入同一实例。
也就是说,应避免使用单例寿命。由于此处的课程非常基础,仅管理内存列表,因此并不太麻烦,但在更高级的情况下,使用单例可以束缚您并鼓励其他不良做法,例如服务定位器。