[英]FromResult or IServiceScopeFactory in Blazor server-side
因此,在通过 EF Core 获取数据时,我一直将 IServiceScopeFactory 注入我的页面以使用它的 scope。 但是昨天我偶然发现有人在调用数据库时使用 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,它将一直存在,直到您关闭网站。 所以这会产生一个错误:“在前一个操作完成之前,在此上下文上启动了第二个操作。”。
你无法比较两者,因为它们没有任何共同点。
Task.FromResult只是创建一个以指定结果成功完成的任务。 我相信使用 Task.FromResult 的主要用例之一是当您实现异步接口但您的实现是同步的,如上面的示例所示。 这对于数据库调用来说并不是一个好主意,因为它们可能需要很长时间。
我不确定您为什么使用上面的IServiceScopeFactory
。 如果您请求的服务的范围仅限于您请求它的组件的生命周期,那么有更好的方法。
public class MyComponent : OwningComponentBase<IMyService>
{
protected void GetSomeData(int id)
{
var someData = await Service.GetSomeData(id);
}
}
public class MyService : IMyService
{
public async Task<List<SomeData>> GetSomeData(int id)
{
return await db.SomeTable.Where(x => x.Id == id).ToListAsync();
}
}
通过使用 OwningComponentBase,可以在后台为您创建服务 scope,并且该服务由基础组件通过Service
属性公开。 如果您想了解更多信息,我已经写了一篇关于它的博客文章。
我不确定我是否理解您为什么将 Task.FromResult 与 IServiceScopeFactory 进行比较,无论如何,尚不清楚您为什么在代码中使用 IServiceScopeFactory。
您不应等待对 Task.FromResult 的调用。 这种方法是在立即知道结果的情况下使用的,并且不需要处理,所以为什么要等待它。 数据库调用应该异步使用,调用可能需要漫长而复杂的过程。 并且永远不应该与 Task.FromResult 一起使用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.