ASP.NET Core 2.1无法从托管服务访问数据库上下文

时间:2018-10-17 19:18:08

标签: asp.net-core asp.net-core-hosted-services

我正在asp.net core 2.1中编写一个承载了服务的应用程序。原因是我偶尔需要对数据库进行一些检查。

我遇到了一些问题。我无法在托管服务中注入数据库上下文,因为托管服务是单例服务,而数据库上下文是作用域服务。

我试图通过创建一个额外的Web API来解决该问题,该API处理我需要做的事情,并在需要时让我的托管服务调用该API。这就增加了一个问题,即暴露API,并且必须将绝对URL硬编码到我的托管服务类中,因为相对URL不起作用。

对我来说,整件事感觉就像是骇客。也许有一种更好的方式来实现我的需求。因此,我在这里向某人请教有关我问题的最佳做法的建议。谢谢!

1 个答案:

答案 0 :(得分:1)

要在IHostedService中使用作用域对象,必须使用IServiceScopeFactory创建依赖项注入作用域。在此范围内,您可以使用范围服务。 在后台任务中使用范围服务的doc对此做了解释。

public class TimedHostedService : IHostedService, IDisposable
{
    private readonly IServiceScopeFactory _scopeFactory;
    private readonly ILogger _logger;
    private Timer _timer;

    public TimedHostedService(ILogger<TimedHostedService> logger, IServiceScopeFactory scopeFactory)
    {
        _logger = logger;
        _scopeFactory = scopeFactory;
    }

    // Other methods 

    private void DoWork(object state)
    {
        _logger.LogInformation("Timed Background Service is working.");

        using (var scope = _scopeFactory.CreateScope())
        {
            var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>();
            //Do your stuff with your Dbcontext
              ...          
        }
    }
}