Files
2026-03-13 09:11:35 -05:00

62 lines
1.6 KiB
C#

using Microsoft.Extensions.Hosting;
using OwnerNumberMigration.ValueParsing;
namespace OwnerNumberMigration.Migrations;
public abstract class AttributeMigrationTask<T> : IHostedService
{
private readonly IAttributeMigration _migration;
private readonly CancellationTokenSource _cancellation = new();
private readonly IMigrationManager _manager;
private Task? _runningMigration;
protected AttributeMigrationTask
(
string sourceAttribute,
string destinationAttribute,
AttributeMigrationFactory<T> factory,
IParsingStrategyFactory strategyFactory,
IMigrationManager manager
)
{
_manager = manager;
_migration = factory
(
sourceAttribute,
strategyFactory.CreateParsingStrategy<T>(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();
}
}