gpt4 book ai didi

c# - Blazor 服务器端的 FromResult 或 IServiceScopeFactory

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:20 27 4
gpt4 key购买 nike

因此,我一直在将 IServiceScopeFactory 注入(inject)我的页面,以便在通过 EF Core 获取数据时使用它的作用域。但是昨天我偶然发现有人在调用数据库时使用 Task.FromResult。一个比另一个更受欢迎吗?如果是,为什么?

提前致谢!

前任务.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 的主要用例之一是当您实现异步接口(interface)但您的实现是同步的时,如上例所示。这对于数据库调用来说并不是一个好主意,因为它们可能需要很长时间。

我不确定您为什么要使用上面的 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如果您想了解更多信息,请访问它。

关于c# - Blazor 服务器端的 FromResult 或 IServiceScopeFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58407384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com