【发布时间】:2019-10-16 06:54:17
【问题描述】:
所以我一直将 IServiceScopeFactory 注入到我的页面中,以便在通过 EF Core 获取数据时使用它的范围。 但是昨天我偶然发现有人在调用数据库时使用 Task.FromResult。 一个比另一个更受欢迎,如果是,为什么?
提前谢谢你!
Ex Task.FromResult
//In code behind
[Inject]
IMyService myService { get; set; }
protected void GetSomeData()
{
var someData = await myServie.GetSomeData();
}
//From serviceClass
public async Task<List<SomeData>> GetSomeData(int id)
{
return await Task.FromResult(db.SomeTable.Where(x => x.Id == qualifierVersionId).AsEnumerable());
}
前
//In code behind
[Inject]
IServiceScopeFactory ScopeFactory { get; set; }
protected void GetSomeData()
{
using (var serviceScope = ScopeFactory.CreateScope())
{
var myService = serviceScope.ServiceProvider.GetService<IMyService>();
var someData = await myServie.GetSomeData();
}
}
//From serviceClass
public async Task<List<SomeData>> GetSomeData(int id)
{
return await db.SomeTable.Where(x => x.Id == id).ToListAsync();
}
编辑(因为我想知道要走哪条路的问题)
我需要使用其中一个,因为在使用服务器端 Blazor 时,生命周期会使 Scoop 的行为类似于 Singleton。因此,如果我例如调用 return await db.SomeTable.Where(x => x.Id == id).ToListAsync();如果没有 IServiceScopeFactory,它将一直存在,直到您关闭网站。所以这会产生一个错误:“在前一个操作完成之前,在此上下文上启动了第二个操作。”。
【问题讨论】:
标签: c# blazor blazor-server-side