- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
因此,我一直在将 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/
因此,我一直在将 IServiceScopeFactory 注入(inject)我的页面,以便在通过 EF Core 获取数据时使用它的作用域。但是昨天我偶然发现有人在调用数据库时使用 Task.Fr
我的理解是,当使用内置的依赖注入(inject)时,.NET Core 控制台应用程序将要求您自己创建和管理所有范围,而 ASP.NET Core 应用程序将创建和管理 HttpRequest范围默认
我正在开发一个应用程序 Asp.net 核心 使用 Autofac 作为默认 DI,在我的集成测试中,我需要一些服务,在安装之前 我通过创建 IServiceScopeFactory 注入(injec
我是一名优秀的程序员,十分优秀!