#c# #asp.net #entity-framework-core
#c# #asp.net #сущность-фреймворк-ядро
Вопрос:
В прошлом семестре я создал небольшое веб-приложение для колледжа и столкнулся с проблемой, которую не смог должным образом решить. Приложение представляет собой приложение для отслеживания цен, которое использует Selenium или curl для поиска товаров с веб-страниц и отслеживания их цены с течением времени.
Моя проблема в том, как мне правильно получить доступ к контексту базы данных за пределами файлов .cshtml.cs? Моим текущим решением для этого было иметь глобальную переменную, которая присваивается контексту базы данных из Main()
класса как такового:
public static ProductContext globalContext;
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
var scope = host.Services.CreateScope();
var services = scope.ServiceProvider;
globalContext = services.GetRequiredService<ProductContext>();
Затем в классе очистки я мог бы сохранить найденную информацию как таковую:
Program.globalContext.SaveChanges();
Мое решение с глобальными переменными работает для этого, но в лучшем случае это похоже на хакерское решение. Я искал в Интернете как мог, мой профессор тоже не смог предложить лучшего решения, но должен же быть способ сделать это правильно?
Полный репозиторий здесь
Ответ №1:
Я, наконец, понял это для себя, проведя исследование для другого школьного проекта, включающего asp.net .
При чтении asp.net документация Я заметил фоновую задачу с функцией размещенных служб. Оттуда я смог составить план, используя внедрение зависимостей, чтобы передавать IServiceProvider в IJob всякий раз, когда Quartz настроен на выполнение задания. Я думаю, что частью моей первоначальной проблемы был тот факт, что я пытался передать контекст базы данных методу выполнения IJob, на который жаловался Quartz. Я также нашел эту статью о фоновых задачах с Quartz весьма полезной при разработке моего решения.
Мой IJob теперь выглядит так:
public class scrapeJob : IJob
{
private IServiceProvider services {get; }
public scrapeJob(IServiceProvider service)
{
services = service;
}
async Task IJob.Execute(IJobExecutionContext context)
{
Console.Out.WriteLine("Begin Scheduled Job...");
using(var scope = services.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<ProductContext>();
var scraper = new scrape(dbContext);
await Task.Run(scraper.Scrape());
}
}
}
Ссылка на Quartz.net