diff --git a/src/core/Elsa.Core/Runtime/StartupRunner.cs b/src/core/Elsa.Core/Runtime/StartupRunner.cs index c9c393d16..0c08c93da 100644 --- a/src/core/Elsa.Core/Runtime/StartupRunner.cs +++ b/src/core/Elsa.Core/Runtime/StartupRunner.cs @@ -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 _logger; - private readonly ICollection _startupTasks; + private readonly ICollection _startupTaskTypes; - public StartupRunner(IEnumerable startupTasks, ILogger logger) + public StartupRunner(IEnumerable startupTasks, IServiceScopeFactory scopeFactory, ILogger 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); } }