繁体   English   中英

Blazor 服务器端中的 FromResult 或 IServiceScopeFactory

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM