从一个页面,我调用一个服务,像这样:
_ = _importUserService.AddManyUserAsync(ValidatedUsers);
我希望Page()返回并让用户/UI继续前进,而服务在后台使用UserManager添加许多用户。问题是,一旦Page()返回并且请求完成,IdentityDbContext就会关闭,UserManager不再起作用。如何在请求完成后保持UserManager工作?
服务正在使用标准依赖注入:
private readonly UserManager<ApplicationUser> _userManager;
public ImportUserService(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
如果我使用await而不是discard并强制服务在页面加载之前完成,它会工作得很好;然而,如果用户在页面加载之前需要等待2分钟来导入数千个用户,这将是非常糟糕的用户体验。我的问题是,在不创建存储过程和复制UserManager正在做的事情的情况下,是否有一种方法可以在不依赖于请求生命周期的服务中使用UserManager ?
我的想法是创建UserManager的一个新实例,而不是依赖于依赖注入的实例,但我到目前为止还无法使其工作。不确定语法是什么,找不到一个实际在。net core 3.1中工作的例子
如何在请求后保持IdentityDbContext存活,以便服务可以使用UserManager完成其任务?(.Net Core 3.1)
从文档
https://learn.microsoft.com/en - us/aspnet/core/fundamentals/host/hosted services?view=aspnetcore - 3.1,标签= visual studio # consuming-a-scoped-service-in-a-background-task
这允许我运行一个后台服务,它可以调用使用UserManager的服务
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices(services =>
{
services.AddHostedService<ConsumeScopedServiceHostedService>();
});
}
public class ConsumeScopedServiceHostedService : BackgroundService
{
private readonly ILogger<ConsumeScopedServiceHostedService> _logger;
public ConsumeScopedServiceHostedService(IServiceProvider services,
ILogger<ConsumeScopedServiceHostedService> logger)
{
Services = services;
_logger = logger;
}
public IServiceProvider Services { get; }
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation(
"Consume Scoped Service Hosted Service running.");
await DoWork(stoppingToken);
}
private async Task DoWork(CancellationToken stoppingToken)
{
_logger.LogInformation(
"Consume Scoped Service Hosted Service is working.");
using (var scope = Services.CreateScope())
{
var scopedProcessingService =
scope.ServiceProvider
.GetRequiredService<IScopedProcessingService>();
await scopedProcessingService.DoWork(stoppingToken);
}
}
public override async Task StopAsync(CancellationToken stoppingToken)
{
_logger.LogInformation(
"Consume Scoped Service Hosted Service is stopping.");
await base.StopAsync(stoppingToken);
}
}
,工作在IScopedProcessingService>DoWork (stoppingToken)这意味着ScopedProcessingService可以访问与使用我的问题中所示的依赖注入的典型web服务相同的服务。