62 lines
1.6 KiB
C#
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();
|
|
}
|
|
} |