using Microsoft.Extensions.Hosting; using OwnerNumberMigration.ValueParsing; namespace OwnerNumberMigration.Migrations; public abstract class AttributeMigrationTask : IHostedService { private readonly IAttributeMigration _migration; private readonly CancellationTokenSource _cancellation = new(); private readonly IMigrationManager _manager; private Task? _runningMigration; protected AttributeMigrationTask ( string sourceAttribute, string destinationAttribute, AttributeMigrationFactory factory, IParsingStrategyFactory strategyFactory, IMigrationManager manager ) { _manager = manager; _migration = factory ( sourceAttribute, strategyFactory.CreateParsingStrategy(sourceAttribute), destinationAttribute ); } public Task StartAsync(CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) return Task.CompletedTask; _manager.Start(_runningMigration = _migration.Migrate(_cancellation.Token)); return Task.CompletedTask; } public async Task StopAsync(CancellationToken cancellationToken) { if (_runningMigration is not null) { if (!_runningMigration.IsCompleted) { _cancellation.Cancel(); try { await _runningMigration; } catch (TaskCanceledException) { } } _runningMigration.Dispose(); } _cancellation.Dispose(); } }