在某些 asp.net mvc 应用程序(在 .net core 2.1 下)中,我需要手动为后台任务创建范围。(对于 2.2 这也是相关的,但似乎没有区别)
我在广阔的网络中遇到了两个完全可行的选择,如何做到这一点。
第一个选项是在 IServiceProvider 的基础上构建的(示例):
internal class TimedHostedService : IHostedService, IDisposable
{
public TimedHostedService(IServiceProvider services)
{
}
private async Task Test()
{
using (var scope = _services.CreateScope())
{
var mediator = scope.ServiceProvider.GetRequiredService<IMediator>();
await mediator.Send(new Application.Test.Command());
}
}
}
第二个选项是在 IServiceScopeFactory (example1,example2)的基础上构建的:
internal class TimedHostedService : IHostedService, IDisposable
{
public TimedHostedService(IServiceScopeFactory scopeFactory)
{
}
private async Task Test()
{
using (var scope = _scopeFactory.CreateScope())
{
var mediator = scope.ServiceProvider.GetRequiredService<IMediator>();
await mediator.Send(new Application.Test.Command());
}
}
...
}
如果两者都做同样的工作,我不太明白它们之间有什么区别。这是否与核心 2.1 和核心 2.2 中的不同方法有关?还是不同部门的微软为同一件事做了类似的事情?
在 Web 应用程序中使用的首选方式是什么?我不知道要测量哪些参数,比如说速度或 RAM 使用率。
如果你看一下 for 的方法
CreateScope是如何实现的IServiceProvider,那么它是这样实现的:所以就性能而言,没有区别。但是,在语义方面存在差异:
使用
IServiceScopeFactory,您明确声明您将创建嵌套区域;使用
IServiceProvider,您没有声明任何内容。另外,如果突然你的容器不支持
IServiceScopeFactory,那么显式使用这个类的选项会在启动时崩溃(这很好,因为它很快失败),并且IServiceProvider每次尝试完成任务时都会崩溃.