相关疑难解决方法(0)

我应该如何将一个DbContext实例注入IHostedService?

我应该如何将一个DbContext实例注入(使用标准依赖注入)IHostedService

我试过了什么

我目前让我的IHostedServiceMainContextDbContext构造函数中获取(派生自)实例.

当我运行应用程序时,我得到:

无法从singleton'Microsoft.Extensions.Hosting.IHostedService'中使用作用域服务"Microsoft.EntityFrameworkCore.DbContextOptions".

所以我试着DbContextOptions通过指定来制作瞬态:

services.AddDbContext<MainContext>(options => 
                options.UseSqlite("Data Source=development.db"), ServiceLifetime.Transient);
Run Code Online (Sandbox Code Playgroud)

在我Startup班上

但是错误仍然是相同的,即使根据这个解决的Github问题,DbContextOptions传递的应该具有在AddDbContext调用中指定的相同生命周期.

我无法使数据库上下文成为单例,否则对它的并发调用将产生并发异常(由于数据库上下文不保证是线程安全的事实).

.net c# asp.net .net-core asp.net-core

36
推荐指数
2
解决办法
1万
查看次数

在 .NET Core 5 托管服务的 StartAsync 和 StopAsync 中返回什么?

尝试大致遵循MSDN,我在课堂上的范围服务之后添加了托管服务StartUp

public void ConfigureServices(IServiceCollection services)
{
  ...
  services.AddScoped<IUtilityService, UtilityService>();
  services.AddHostedService<StartupService>();
  ...
}
Run Code Online (Sandbox Code Playgroud)

我是StartAsync这样实现的。

public class StartupService : IHostedService
{
  private IServiceProvider Provider { get; }
  public StartupService(IServiceProvider provider)
  {
    Provider = provider;
  }

  public Task StartAsync(CancellationToken cancellationToken)
  {
    IServiceScope scope = Provider.CreateScope();
    IUtilityService service = scope.ServiceProvider
      .GetRequiredService<IUtilityService>();

    service.Seed();

    return Task.CompletedTask;
  }

  public Task StopAsync(CancellationToken cancellationToken)
  {
    throw new NotImplementedException();
  }
}
Run Code Online (Sandbox Code Playgroud)

我读过很多文章和博客,但我无法理解方法末尾应该返回什么。它现在似乎有效,但我可以清楚地看到,我通过不使用异步调用并返回一个虚拟值来违反这个想法(甚至在停止时也没有!),所以我可以安全地得出结论,我做错了(尽管不是)显然,但我确信它将来会咬我的屁股)。

我应该在实现中返回什么以确保我“使用”而不是反对框架?

c# .net-core asp.net-core-hosted-services asp.net-core-5.0

5
推荐指数
1
解决办法
2822
查看次数