ASP.NET Core 2.1 Не удается получить доступ к контексту базы данных из размещенной службы - PullRequest
0 голосов
/ 17 октября 2018

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

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

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

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

1 Ответ

0 голосов
/ 18 октября 2018

Чтобы использовать объект с областью действия в 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
              ...          
        }
    }
}
...