后续请求之间的作用域服务实例

时间:2017-11-29 10:20:04

标签: c# asp.net-core

在了解了作用域/单例/瞬态服务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)。

据我所知,作用域服务为同一会话中的所有请求维护相同的实例(即直到我关闭浏览器)。 我理解错了吗?

0 个答案:

没有答案