using ConsoleApp2.Entities; using ConsoleApp2.Helpers; using ConsoleApp2.Options; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace ConsoleApp2.Services; public class DataTransformService { private readonly ILogger _logger; private readonly TaskManager _taskManager; private readonly DatabaseOutputService _output; private readonly IOptions _options; public DataTransformService(ILogger logger, TaskManager taskManager, DatabaseOutputService output, IOptions options) { _logger = logger; _taskManager = taskManager; _output = output; _options = options; } public async Task ExecuteAsync(DataRecordQueue records, CancellationToken cancellationToken = default) { _logger.LogInformation("Start transforming data."); var map = new Dictionary(); while (records.TryDequeue(out var record)) { var dbOptions = _options.Value.DatabaseFilter(record); map.AddOrUpdate(dbOptions, new DataRecordQueue([record]), (options, queue) => { queue.Enqueue(record); return queue; }); } foreach (var (dbOptions, queue) in map) { await _taskManager.CreateTask(async () => { await _output.ExecuteAsync(queue, dbOptions, cancellationToken); }); } } }