我正在asp.net core 2.1中编写一个承载了服务的应用程序。原因是我偶尔需要对数据库进行一些检查。
我遇到了一些问题。我无法在托管服务中注入数据库上下文,因为托管服务是单例服务,而数据库上下文是作用域服务。
我试图通过创建一个额外的Web API来解决该问题,该API处理我需要做的事情,并在需要时让我的托管服务调用该API。这就增加了一个问题,即暴露API,并且必须将绝对URL硬编码到我的托管服务类中,因为相对URL不起作用。
对我来说,整件事感觉就像是骇客。也许有一种更好的方式来实现我的需求。因此,我在这里向某人请教有关我问题的最佳做法的建议。谢谢!
答案 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
...
}
}
}