ASP.NET Core 2.1 Не удается получить доступ к контексту базы данных из размещенной службы

Я пишу приложение в asp.net core 2.1, в котором размещен сервис. Причина в том, что время от времени мне нужно выполнять некоторые проверки в базе данных.

Я сталкиваюсь с некоторыми проблемами. Я не могу внедрить контекст базы данных в мой размещенный сервис, поскольку размещенный сервис - это одноэлементный сервис, а контекст базы данных - сервис с ограниченным доступом.

Я попытался обойти эту проблему, создав дополнительный веб-API, который обрабатывает то, что мне нужно, и заставив мою размещенную службу вызывать этот API, когда это необходимо. Это добавило проблему разоблачения API и необходимости жесткого кодирования абсолютного URL в моем размещенном классе обслуживания, поскольку относительный URL не работал.

Для меня все это похоже на взлом. Возможно, есть лучший способ добиться того, что мне нужно. Поэтому я здесь, чтобы попросить кого-нибудь посоветовать, каковы наилучшие методы решения моей проблемы. Спасибо!

1 ответ

Решение

Чтобы использовать объект в области IHostedService Вы должны создать область внедрения зависимости с IServiceScopeFactory, В рамках этой области вы можете использовать определенные сервисы. Документ об использовании сервиса с заданной областью в фоновом режиме объяснил это.

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
              ...          
        }
    }
}
Другие вопросы по тегам