在了解了作用域/单例/瞬态服务here之后,我试图理解为什么这段代码不起作用。它是用ASP.NET Core 2编写的。
startup.cs
public void ConfigureServices(IServiceCollection services)
{
// ... other services
services.AddScoped<LiveData, LiveData>();
services.AddScoped<Utils, Utils>();
}
livedata.cs
public class LiveData
{
public LiveData() {
Plcs = new List<Plc>();
}
public List<Plc> Plcs { get; set; }
}
public class Plc
{
public string Name { get; set; }
public DateTime Datetime { get; set; }
public string OperatorName { get; set; }
}
utils.cs
public class Utils
{
private readonly LiveData _liveData;
public Utils(LiveData liveData)
{
_liveData = liveData;
// ... fill in _liveData.Plcs
}
public void SetOperatorName(string name, string operatorName)
{
Plc plc = _liveData.Plcs.SingleOrDefault(x => x.Name == name);
plc.OperatorName = operatorName;
}
}
testpage.chstml.cs
public class MachineDetailsModel : PageModel
{
private readonly LiveData _liveData;
private readonly Utils _utils;
public MachineDetailsModel(LiveData liveData, Utils utils)
{
_liveData = liveData;
_utils = utils;
}
public Plc Plc { get; set; }
public async Task<IActionResult> OnGetAsync(string id)
{
Plc = _liveData.Plcs.SingleOrDefault(x => x.Name == id);
return Page();
}
public IActionResult OnPostSetOperatorName(string name)
{
var operatorName = "foo";
_utils.SetOperatorName(name, operatorName);
Plc = _liveData.Plcs.SingleOrDefault(x => x.Name == name);
return RedirectToPage();
}
}
调用post处理程序时,它会正确更新OperatorName
字段。在返回之前,我检查了Plc
变量,它包含新值“foo”。
但是当页面重新加载(由于帖子)并再次设置Plc
变量时(注意两行相同),OperatorName
将丢失(默认为null)。
据我所知,作用域服务为同一会话中的所有请求维护相同的实例(即直到我关闭浏览器)。 我理解错了吗?