Ensure each startup runner executed in its own scope

This commit is contained in:
Sipke Schoorstra 2021-04-20 19:43:18 +02:00
parent f4e2d4dd5b
commit ea00bd536a

View file

@ -1,28 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Elsa.Services;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Elsa.Runtime
{
public class StartupRunner : IStartupRunner
{
private readonly IServiceScopeFactory _scopeFactory;
private readonly ILogger<StartupRunner> _logger;
private readonly ICollection<IStartupTask> _startupTasks;
private readonly ICollection<Type> _startupTaskTypes;
public StartupRunner(IEnumerable<IStartupTask> startupTasks, ILogger<StartupRunner> logger)
public StartupRunner(IEnumerable<IStartupTask> startupTasks, IServiceScopeFactory scopeFactory, ILogger<StartupRunner> logger)
{
_scopeFactory = scopeFactory;
_logger = logger;
_startupTasks = startupTasks.OrderBy(x => x.Order).ToList();
_startupTaskTypes = startupTasks.OrderBy(x => x.Order).Select(x => x.GetType()).ToList();
}
public async Task StartupAsync(CancellationToken cancellationToken = default)
{
foreach (var startupTask in _startupTasks)
// TODO: Register Startup Types the same way Activity Types are registered.
foreach (var startupTaskType in _startupTaskTypes)
{
_logger.LogInformation("Running startup task {StartupTaskName}", startupTask.GetType().Name);
using var scope = _scopeFactory.CreateScope();
var startupTask = (IStartupTask)scope.ServiceProvider.GetRequiredService(startupTaskType);
_logger.LogInformation("Running startup task {StartupTaskName}", startupTaskType.Name);
await startupTask.ExecuteAsync(cancellationToken);
}
}