Как запланировать задачу после успешной загрузки файла с помощью внедрения зависимостей? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть следующее действие загрузки файла в моем контроллере, где я загружаю текстовый файл для импорта в базу данных. Этот API-интерфейс занимает очень много времени, когда размер моего файла превышает 10MB . Поэтому я хочу изменить эту функцию импорта на запланированную службу, которая будет запускать 5 сек после загрузки и входа в базу данных. Я хочу запустить это расписание только после успешного сохранения в каталоге.

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

Есть ли способ, которым я могу использоватьвнедрение зависимостей и регистрация службы расписаний для выполнения операций с базой данных из этого API, любая помощь приветствуется?

        [HttpPost("Upload")]
        [ProducesResponseType(200)]
        [ProducesResponseType(400)]
        public async Task<IActionResult> Upload([FromForm] IFormFile file)
        {
            if (file == null) return BadRequest("file cannot be nulled");
            if (file.Length == 0) return BadRequest("file is empty");
            if (file.Length > _fileSetting.MaxBytes) return BadRequest($"Max File Size in Bytes({_fileSetting.MaxBytes}) exceeded, Current File Size is {file.Length}");

            if (string.IsNullOrWhiteSpace(_env.WebRootPath))
            {
                _env.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
            }
            var uploadFolderPath = Path.Combine(_env.WebRootPath, "uploads");

            if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
            var fileName = DateTime.Now.ToString("ddMMyyyyHHmmss");
            var filePath = Path.Combine(uploadFolderPath, fileName);
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(stream);
            }

            // I want to put this three lines in scheduled task.
            var rows = await ImportUserHelper.ReadAllLinesAsync(filePath);
            var users = ImportUserHelper.ConvertStringArrayToUsers(rows);

            var result = await _userService.SaveRangeAsync(users, DateTime.Now, true);
            //-----------------------------

            return Ok(result);
        }
...