Удалите объект вопроса из базы данных через 3 дня, если на него не ответили - PullRequest
0 голосов
/ 08 июля 2020

Я работаю над проектом веб-приложения с использованием ядра. net и хочу самостоятельно закрыть (удалить) объект вопроса из базы данных (MySQL в моем случае), если он был опубликован в течение 3 дней без ответа. Я считаю, что могу использовать рабочие службы, но я не уверен, как их использовать, и логично ли иметь так много фоновых служб, работающих в фоновом режиме (по одной службе / таймеру на каждый вопрос). Спасибо.

Ответы [ 3 ]

1 голос
/ 08 июля 2020

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

0 голосов
/ 08 июля 2020

Вам понадобится только одна фоновая служба для этого задания.

Предполагаю, что у вас уже есть интерфейс службы:

public interface IQuestionService {
    Task<IEnumerable<Question>> GetQuestionsToClose();
    Task CloseQuestions(IEnumerable<Question> questions);
}

Затем вам нужно реализовать фоновую службу:

public CloseQuestionsBackgroundService : BackgroundService
{
    private readonly IQuestionService questionService;
    public CloseQuestionsBackgroundService(IQuestionService questionService)
    {
        this.questionService = questionService;
    }
    protected override async Task ExecuteAsync(CancellationToken stopToken)
    {
      while (!stopToken.IsCancellationRequested)
      {
          var questionsToClose = questionService.GetQuestionsToClose().ConfigureAwait(false);
          if (questionsToClose.Any())
          {
               await questionService.CloseQuestions(questionsToClose).ConfigureAwait(false);
          }
          await Task.Delay(Timespan.FromSeconds(10)).ConfigureAwait(false); // choose how much time between iterations
      }
   }
}

Теперь вам просто нужно зарегистрировать фоновую службу в методе ConfigureService вашего Startup.cs

 services.AddHostedService<CloseQuestionsBackgroundService>();
0 голосов
/ 08 июля 2020

Я предлагаю создать задание агента в sql для этого со связью между таблицей вопросов и таблицей ответов, и ваш запрос выглядит следующим образом

Delete from QuestionsTable 
where id not in (select FK_questionID from AnswersTable) 
AND CreateDate < DATE_ADD(NOW() , INTERVAL -3 DAY)

и выполнять этот запрос каждый день

также вы можете обновить активное поле в таблице вопросов

Надеюсь, это вам поможет

...