46 lines
1.5 KiB
C#
46 lines
1.5 KiB
C#
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<DataTransformOptions> _options;
|
|
|
|
public DataTransformService(ILogger<DataTransformService> logger, TaskManager taskManager, DatabaseOutputService output, IOptions<DataTransformOptions> 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<DatabaseOptions, DataRecordQueue>();
|
|
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);
|
|
});
|
|
}
|
|
}
|
|
} |