【问题标题】:FromResult or IServiceScopeFactory in Blazor server-sideBlazor 服务器端中的 FromResult 或 IServiceScopeFactory
【发布时间】: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


    【解决方案1】:

    你不能比较两者,因为它们没有任何共同点。

    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,可以在后台为您创建一个服务范围,并且该服务由基础组件通过 Service 属性公开。如果您想了解更多信息,我已经written a blog post

    【讨论】:

    • 好的,谢谢您的回复。我实际上已经看过博客文章并将其标记下来以供稍后阅读。我现在就读。
    猜你喜欢
    • 2020-03-25
    • 2021-05-28
    • 2020-05-15
    • 1970-01-01
    • 2020-09-19
    • 2020-04-14
    • 2020-09-26
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多