using System; using Elsa.AutoMapper.Extensions; using Elsa.Dashboard.ActionFilters; using Elsa.Dashboard.Options; using Elsa.Dashboard.Services; using Elsa.Mapping; using Elsa.Runtime; using Elsa.Serialization; using Elsa.Serialization.Formatters; using Elsa.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; namespace Elsa.Dashboard.Extensions { public static class DashboardServiceCollectionExtensions { public static IServiceCollection AddElsaDashboard( this IServiceCollection services, Action> options = default, Action configure = default ) { var configuration = new ElsaBuilder(services); services.AddControllersWithViews(); configuration.WithElsaDashboard(); configure?.Invoke(configuration); var optionsBuilder = services.AddOptions(); options?.Invoke(optionsBuilder); if (options == null) optionsBuilder.Configure(x => x.DiscoverActivities()); services .AddTaskExecutingServer() .AddTempData(); services.AddMvcCore( mvc => { mvc.Filters.AddService(); } ); return services; } private static ElsaBuilder WithElsaDashboard(this ElsaBuilder builder) { var services = builder.Services; services .AddSingleton() .AddSingleton() .AddSingleton() .TryAddProvider(ServiceLifetime.Singleton) .TryAddProvider(ServiceLifetime.Singleton) .TryAddProvider(ServiceLifetime.Singleton) .AddHttpContextAccessor() .AddScoped() .AddScoped() .AddScoped() .AddAutoMapperProfile(ServiceLifetime.Singleton); services.AddScoped( sp => { var accessor = sp.GetRequiredService(); var factory = sp.GetRequiredService(); return factory.GetTempData(accessor.HttpContext); } ); services.AddMvcCore( mvc => { mvc.Filters.AddService(); } ); return builder; } private static IServiceCollection AddTempData(this IServiceCollection services) { return services.AddScoped( sp => { var accessor = sp.GetRequiredService(); var factory = sp.GetRequiredService(); return factory.GetTempData(accessor.HttpContext); } ); } } }