diff --git a/src/activities/Elsa.Activities.AzureServiceBus/StartupTasks/StartServiceBusQueues.cs b/src/activities/Elsa.Activities.AzureServiceBus/StartupTasks/StartServiceBusQueues.cs index a62c94cae..bb1582ed3 100644 --- a/src/activities/Elsa.Activities.AzureServiceBus/StartupTasks/StartServiceBusQueues.cs +++ b/src/activities/Elsa.Activities.AzureServiceBus/StartupTasks/StartServiceBusQueues.cs @@ -40,7 +40,7 @@ namespace Elsa.Activities.AzureServiceBus.StartupTasks private async IAsyncEnumerable GetQueueNamesAsync([EnumeratorCancellation] CancellationToken cancellationToken) { var workflowRegistry = _serviceProvider.GetRequiredService(); - var workflows = await workflowRegistry.GetWorkflowsAsync(cancellationToken).ToListAsync(cancellationToken); + var workflows = await workflowRegistry.ListAsync(cancellationToken); var query = from workflow in workflows diff --git a/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs b/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs index 30cd8fe6a..450ca6f4f 100644 --- a/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs +++ b/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs @@ -134,7 +134,7 @@ namespace Elsa.Activities.Http.Middleware CancellationToken cancellationToken) { // Find workflows starting with HttpRequestReceived. - var workflows = await workflowRegistry.GetWorkflowsAsync(cancellationToken).ToListAsync(cancellationToken); + var workflows = await workflowRegistry.ListAsync(cancellationToken); var httpWorkflows = from workflow in workflows diff --git a/src/activities/Elsa.Activities.Timers.Hangfire/Jobs/RunHangfireWorkflowJob.cs b/src/activities/Elsa.Activities.Timers.Hangfire/Jobs/RunHangfireWorkflowJob.cs index f172b6731..8bbe20e13 100644 --- a/src/activities/Elsa.Activities.Timers.Hangfire/Jobs/RunHangfireWorkflowJob.cs +++ b/src/activities/Elsa.Activities.Timers.Hangfire/Jobs/RunHangfireWorkflowJob.cs @@ -25,7 +25,7 @@ namespace Elsa.Activities.Timers.Hangfire.Jobs public async Task ExecuteAsync(RunHangfireWorkflowJobModel data) { - var workflowBlueprint = (await _workflowRegistry.GetWorkflowAsync(data.WorkflowDefinitionId, data.TenantId, VersionOptions.Published)); + var workflowBlueprint = (await _workflowRegistry.GetAsync(data.WorkflowDefinitionId, data.TenantId, VersionOptions.Published)); if(workflowBlueprint == null) return; diff --git a/src/activities/Elsa.Activities.Timers.Quartz/Jobs/RunQuartzWorkflowJob.cs b/src/activities/Elsa.Activities.Timers.Quartz/Jobs/RunQuartzWorkflowJob.cs index 198374d21..d51a10521 100644 --- a/src/activities/Elsa.Activities.Timers.Quartz/Jobs/RunQuartzWorkflowJob.cs +++ b/src/activities/Elsa.Activities.Timers.Quartz/Jobs/RunQuartzWorkflowJob.cs @@ -58,7 +58,7 @@ namespace Elsa.Activities.Timers.Quartz.Jobs { if (workflowInstanceId == null) { - var workflowBlueprint = (await _workflowRegistry.GetWorkflowAsync(workflowDefinitionId, tenantId, VersionOptions.Published, cancellationToken))!; + var workflowBlueprint = (await _workflowRegistry.GetAsync(workflowDefinitionId, tenantId, VersionOptions.Published, cancellationToken))!; if (!workflowBlueprint.IsSingleton || await GetWorkflowIsAlreadyExecutingAsync(tenantId, workflowDefinitionId) == false) await _workflowQueue.EnqueueWorkflowDefinition(workflowDefinitionId, tenantId, activityId, null, null, null, cancellationToken); diff --git a/src/activities/Elsa.Activities.Timers/Bookmarks/TimerBookmark.cs b/src/activities/Elsa.Activities.Timers/Bookmarks/TimerBookmark.cs index 532627e5c..ea54a28e4 100644 --- a/src/activities/Elsa.Activities.Timers/Bookmarks/TimerBookmark.cs +++ b/src/activities/Elsa.Activities.Timers/Bookmarks/TimerBookmark.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; diff --git a/src/core/Elsa.Abstractions/Caching/ISignal.cs b/src/core/Elsa.Abstractions/Caching/ISignal.cs index b2ac6ba3e..a8c80c51f 100644 --- a/src/core/Elsa.Abstractions/Caching/ISignal.cs +++ b/src/core/Elsa.Abstractions/Caching/ISignal.cs @@ -2,6 +2,9 @@ namespace Elsa.Caching { + /// + /// Provides change tokens for memory caches, allowing code to evict cache entries by triggering a signal. + /// public interface ISignal { IChangeToken GetToken(string key); diff --git a/src/core/Elsa.Abstractions/Services/IWorkflowBlueprintReflector.cs b/src/core/Elsa.Abstractions/Services/IWorkflowBlueprintReflector.cs index ac8b03ddf..454f9645c 100644 --- a/src/core/Elsa.Abstractions/Services/IWorkflowBlueprintReflector.cs +++ b/src/core/Elsa.Abstractions/Services/IWorkflowBlueprintReflector.cs @@ -2,7 +2,6 @@ using System.Threading; using System.Threading.Tasks; using Elsa.Services.Models; -using Microsoft.Extensions.DependencyInjection; namespace Elsa.Services { diff --git a/src/core/Elsa.Abstractions/Services/IWorkflowRegistry.cs b/src/core/Elsa.Abstractions/Services/IWorkflowRegistry.cs index c53f13a03..0d442febb 100644 --- a/src/core/Elsa.Abstractions/Services/IWorkflowRegistry.cs +++ b/src/core/Elsa.Abstractions/Services/IWorkflowRegistry.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -8,7 +9,9 @@ namespace Elsa.Services { public interface IWorkflowRegistry { - IAsyncEnumerable GetWorkflowsAsync(CancellationToken cancellationToken = default); - Task GetWorkflowAsync(string id, string? tenantId, VersionOptions version, CancellationToken cancellationToken = default); + Task> ListAsync(CancellationToken cancellationToken = default); + Task GetAsync(string id, string? tenantId, VersionOptions version, CancellationToken cancellationToken = default); + Task> FindManyAsync(Func predicate, CancellationToken cancellationToken = default); + Task FindAsync(Func predicate, CancellationToken cancellationToken = default); } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Activities/Workflows/RunWorkflow/RunWorkflow.cs b/src/core/Elsa.Core/Activities/Workflows/RunWorkflow/RunWorkflow.cs index aecffe7ee..907a9b14c 100644 --- a/src/core/Elsa.Core/Activities/Workflows/RunWorkflow/RunWorkflow.cs +++ b/src/core/Elsa.Core/Activities/Workflows/RunWorkflow/RunWorkflow.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -69,7 +68,7 @@ namespace Elsa.Activities.Workflows private async Task FindWorkflowBlueprintAsync(CancellationToken cancellationToken) { - var query = (IEnumerable)(await _workflowRegistry.GetWorkflowsAsync(cancellationToken).ToListAsync(cancellationToken)); + var query = await _workflowRegistry.ListAsync(cancellationToken); query = query.Where(x => x.WithVersion(VersionOptions.Published)); diff --git a/src/core/Elsa.Core/Bookmarks/BookmarkIndexer.cs b/src/core/Elsa.Core/Bookmarks/BookmarkIndexer.cs index f6adc337b..840a1dcdb 100644 --- a/src/core/Elsa.Core/Bookmarks/BookmarkIndexer.cs +++ b/src/core/Elsa.Core/Bookmarks/BookmarkIndexer.cs @@ -10,7 +10,6 @@ using Elsa.Persistence.Specifications.Bookmarks; using Elsa.Serialization; using Elsa.Services; using Elsa.Services.Models; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Open.Linq.AsyncExtensions; using Rebus.Extensions; @@ -61,7 +60,7 @@ namespace Elsa.Bookmarks var workflowInstanceIds = workflowInstanceList.Select(x => x.Id).ToList(); await DeleteBookmarksAsync(workflowInstanceIds, cancellationToken); - var workflowBlueprints = await _workflowRegistry.GetWorkflowsAsync(cancellationToken).ToDictionaryAsync(x => (x.Id, x.Version), cancellationToken); + var workflowBlueprints = (await _workflowRegistry.ListAsync(cancellationToken)).ToDictionary(x => (x.Id, x.Version)); var entities = new List(); foreach (var workflowInstance in workflowInstanceList.Where(x => x.WorkflowStatus == WorkflowStatus.Suspended)) diff --git a/src/core/Elsa.Core/Consumers/RunWorkflowDefinitionConsumer.cs b/src/core/Elsa.Core/Consumers/RunWorkflowDefinitionConsumer.cs index 158672926..b23496aec 100644 --- a/src/core/Elsa.Core/Consumers/RunWorkflowDefinitionConsumer.cs +++ b/src/core/Elsa.Core/Consumers/RunWorkflowDefinitionConsumer.cs @@ -32,7 +32,7 @@ namespace Elsa.Consumers { var workflowDefinitionId = message.WorkflowDefinitionId; var tenantId = message.TenantId; - var workflowBlueprint = await _workflowRegistry.GetWorkflowAsync(workflowDefinitionId, tenantId, VersionOptions.Published); + var workflowBlueprint = await _workflowRegistry.GetAsync(workflowDefinitionId, tenantId, VersionOptions.Published); if (!ValidatePreconditions(workflowDefinitionId, workflowBlueprint)) return; diff --git a/src/core/Elsa.Core/Decorators/CachingWorkflowRegistry.cs b/src/core/Elsa.Core/Decorators/CachingWorkflowRegistry.cs new file mode 100644 index 000000000..ee2d6a77e --- /dev/null +++ b/src/core/Elsa.Core/Decorators/CachingWorkflowRegistry.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Elsa.Caching; +using Elsa.Models; +using Elsa.Services; +using Elsa.Services.Models; +using Microsoft.Extensions.Caching.Memory; +using Open.Linq.AsyncExtensions; + +namespace Elsa.Decorators +{ + public class CachingWorkflowRegistry : IWorkflowRegistry + { + private const string CacheKey = "WorkflowRegistry"; + private readonly IWorkflowRegistry _workflowRegistry; + private readonly IMemoryCache _memoryCache; + private readonly ISignal _signal; + + public CachingWorkflowRegistry(IWorkflowRegistry workflowRegistry, IMemoryCache memoryCache, ISignal signal) + { + _workflowRegistry = workflowRegistry; + _memoryCache = memoryCache; + _signal = signal; + } + + public async Task> ListAsync(CancellationToken cancellationToken) => await GetWorkflowBlueprints(cancellationToken); + + public async Task GetAsync(string id, string? tenantId, VersionOptions version, CancellationToken cancellationToken) => + await FindAsync(x => x.Id == id && x.TenantId == tenantId && x.WithVersion(version), cancellationToken); + + public async Task> FindManyAsync(Func predicate, CancellationToken cancellationToken) + { + var workflows = await GetWorkflowBlueprints(cancellationToken); + return workflows.Where(predicate); + } + + public async Task FindAsync(Func predicate, CancellationToken cancellationToken) + { + var workflows = await GetWorkflowBlueprints(cancellationToken); + return workflows.FirstOrDefault(predicate); + } + + private async Task> GetWorkflowBlueprints(CancellationToken cancellationToken) + { + return await _memoryCache.GetOrCreateAsync(CacheKey, async entry => + { + entry.Monitor(_signal.GetToken(CacheKey)); + return await _workflowRegistry.ListAsync(cancellationToken).ToList(); + }); + } + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs b/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs index 5e771d5e5..a3f4157fd 100644 --- a/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs +++ b/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs @@ -10,7 +10,9 @@ using Elsa.ActivityTypeProviders; using Elsa.Bookmarks; using Elsa.Builders; using Elsa.Consumers; +using Elsa.Decorators; using Elsa.Expressions; +using Elsa.Handlers; using Elsa.HostedServices; using Elsa.Mapping; using Elsa.Messages; @@ -30,7 +32,6 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Newtonsoft.Json; using NodaTime; using Rebus.Handlers; -using Rebus.ServiceProvider; // ReSharper disable once CheckNamespace namespace Microsoft.Extensions.DependencyInjection @@ -60,7 +61,6 @@ namespace Microsoft.Extensions.DependencyInjection .AddWorkflowsCore() .AddCoreActivities(); - options.AddMediatR(); options.AddAutoMapper(); options.AddConsumer(); options.AddConsumer(); @@ -71,12 +71,12 @@ namespace Microsoft.Extensions.DependencyInjection return services; } - + /// /// Starts the specified workflow upon application startup. /// public static IServiceCollection StartWorkflow(this IServiceCollection services) where T : class, IWorkflow => services.AddHostedService>(); - + public static ElsaOptions AddConsumer(this ElsaOptions elsaOptions) where TConsumer : class, IHandleMessages { elsaOptions.Services.AddTransient, TConsumer>(); @@ -84,70 +84,101 @@ namespace Microsoft.Extensions.DependencyInjection return elsaOptions; } - private static ElsaOptions AddMediatR(this ElsaOptions options) - { - options.Services.AddMediatR(mediatr => mediatr.AsScoped(), typeof(IActivity)); - return options; - } - private static ElsaOptions AddWorkflowsCore(this ElsaOptions options) { var services = options.Services; - services.TryAddSingleton(SystemClock.Instance); + + services + .TryAddSingleton(SystemClock.Instance); services .AddLogging() .AddLocalization() - .AddMemoryCache() .AddSingleton() - .AddTransient>(sp => sp.GetRequiredService) - .AddTransient(sp => sp.GetRequiredService().CreateJsonSerializer(sp)) - .AddSingleton() - .AddSingleton() - .TryAddProvider(ServiceLifetime.Singleton) - .TryAddProvider(ServiceLifetime.Singleton) - .AddScoped() .AddScoped() .AddSingleton() .AddScoped() .AddScoped() .AddScoped() - .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() + .AddSingleton() + .AddScoped() + .AddScoped() + .AddSingleton() + .AddSingleton() + .AddScoped() + ; + + // Serialization. + services + .AddTransient>(sp => sp.GetRequiredService) + .AddTransient(sp => sp.GetRequiredService().CreateJsonSerializer(sp)) + .AddSingleton() + .AddSingleton(); + + // Expressions. + services + .TryAddProvider(ServiceLifetime.Singleton) + .TryAddProvider(ServiceLifetime.Singleton) + .AddScoped(); + + // Workflow providers. + services + .AddWorkflowProvider() + .AddWorkflowProvider() + .AddWorkflowProvider(); + + // Metadata. + services + .AddSingleton() + .AddMetadataHandlers(); + + // Bookmarks. + services .AddSingleton() .AddScoped() .AddScoped() .AddScoped() .AddSingleton() .AddScoped() - .AddSingleton() + .AddBookmarkProvider() + .AddBookmarkProvider(); + + // Mediator. + services + .AddMediatR(mediatr => mediatr.AsScoped(), typeof(IActivity), typeof(LogWorkflowExecution)); + + // Service Bus. + services .AddScoped() - .AddScoped() - .AddScoped() - .AddSingleton() - .AddSingleton() - .AddWorkflowProvider() - .AddWorkflowProvider() - .AddWorkflowProvider() - .AddTransient() - .AddTransient() - .AddTransient>(sp => sp.GetRequiredService) - .AddAutoMapperProfile() - .AddAutoMapperProfile() - .AddSingleton() - .AddNotificationHandlers(typeof(ElsaServiceCollectionExtensions)) .AddSingleton() .AddSingleton() .AddSingleton() - .AddSingleton() + .AddSingleton(); + + options + .AddConsumer() + .AddConsumer(); + + // AutoMapper. + services + .AddAutoMapperProfile() + .AddAutoMapperProfile() + .AddSingleton(); + + // Caching. + services + .AddMemoryCache() .AddScoped() - .AddScoped() - .AutoRegisterHandlersFromAssemblyOf() - .AddBookmarkProvider() - .AddBookmarkProvider() - .AddMetadataHandlers(); + .Decorate(); + + // Builder API. + services + .AddTransient() + .AddTransient() + .AddTransient>(sp => sp.GetRequiredService); return options; } diff --git a/src/core/Elsa.Core/Extensions/WorkflowRegistryExtensions.cs b/src/core/Elsa.Core/Extensions/WorkflowRegistryExtensions.cs index 0a8868f83..18773b8f4 100644 --- a/src/core/Elsa.Core/Extensions/WorkflowRegistryExtensions.cs +++ b/src/core/Elsa.Core/Extensions/WorkflowRegistryExtensions.cs @@ -12,7 +12,7 @@ namespace Elsa this IWorkflowRegistry workflowRegistry, string? tenantId, CancellationToken cancellationToken = default) => - workflowRegistry.GetWorkflowAsync(typeof(T).Name, tenantId, VersionOptions.Latest, cancellationToken); + workflowRegistry.GetAsync(typeof(T).Name, tenantId, VersionOptions.Latest, cancellationToken); public static Task GetWorkflowAsync( this IWorkflowRegistry workflowRegistry, @@ -24,7 +24,7 @@ namespace Elsa string id, VersionOptions versionOptions, CancellationToken cancellationToken = default) => - workflowRegistry.GetWorkflowAsync(id, default, versionOptions, cancellationToken); + workflowRegistry.GetAsync(id, default, versionOptions, cancellationToken); // public static async Task> // GetWorkflowsByStartActivityAsync( diff --git a/src/core/Elsa.Core/Services/WorkflowBlueprintReflector.cs b/src/core/Elsa.Core/Services/WorkflowBlueprintReflector.cs index ebad5ce20..def0393f3 100644 --- a/src/core/Elsa.Core/Services/WorkflowBlueprintReflector.cs +++ b/src/core/Elsa.Core/Services/WorkflowBlueprintReflector.cs @@ -2,7 +2,6 @@ using System.Threading; using System.Threading.Tasks; using Elsa.Services.Models; -using Microsoft.Extensions.DependencyInjection; namespace Elsa.Services { diff --git a/src/core/Elsa.Core/Services/WorkflowRegistry.cs b/src/core/Elsa.Core/Services/WorkflowRegistry.cs index 0af881fa0..2d4e2b9ef 100644 --- a/src/core/Elsa.Core/Services/WorkflowRegistry.cs +++ b/src/core/Elsa.Core/Services/WorkflowRegistry.cs @@ -6,6 +6,7 @@ using System.Threading; using System.Threading.Tasks; using Elsa.Models; using Elsa.Services.Models; +using Open.Linq.AsyncExtensions; namespace Elsa.Services { @@ -18,22 +19,11 @@ namespace Elsa.Services _workflowProviders = workflowProviders; } - public async IAsyncEnumerable GetWorkflowsAsync([EnumeratorCancellation] CancellationToken cancellationToken) - { - var providers = _workflowProviders; + public async Task> ListAsync(CancellationToken cancellationToken) => await GetWorkflowsInternalAsync(cancellationToken).ToListAsync(cancellationToken); - foreach (var provider in providers) - await foreach (var workflow in provider.GetWorkflowsAsync(cancellationToken).WithCancellation(cancellationToken)) - yield return workflow; - } - - public async Task GetWorkflowAsync( - string id, - string? tenantId, - VersionOptions version, - CancellationToken cancellationToken) + public async Task GetAsync(string id, string? tenantId, VersionOptions version, CancellationToken cancellationToken) { - var workflows = await GetWorkflowsAsync(cancellationToken).ToListAsync(cancellationToken); + var workflows = await ListAsync(cancellationToken).ToList(); var query = workflows.Where(workflow => workflow.Id == id && workflow.WithVersion(version)); if (tenantId != null) @@ -44,10 +34,19 @@ namespace Elsa.Services .FirstOrDefault(); } - public async Task> FindWorkflowsAsync(Func predicate, CancellationToken cancellationToken) => - await GetWorkflowsAsync(cancellationToken).Where(predicate).OrderByDescending(x => x.Version).ToListAsync(cancellationToken); + public async Task> FindManyAsync(Func predicate, CancellationToken cancellationToken) => + (await ListAsync(cancellationToken).Where(predicate).OrderByDescending(x => x.Version)).ToList(); - public async Task FindWorkflowAsync(Func predicate, CancellationToken cancellationToken) => - await GetWorkflowsAsync(cancellationToken).Where(predicate).OrderByDescending(x => x.Version).FirstOrDefaultAsync(cancellationToken); + public async Task FindAsync(Func predicate, CancellationToken cancellationToken) => + (await ListAsync(cancellationToken).Where(predicate).OrderByDescending(x => x.Version)).FirstOrDefault(); + + private async IAsyncEnumerable GetWorkflowsInternalAsync([EnumeratorCancellation] CancellationToken cancellationToken) + { + var providers = _workflowProviders; + + foreach (var provider in providers) + await foreach (var workflow in provider.GetWorkflowsAsync(cancellationToken).WithCancellation(cancellationToken)) + yield return workflow; + } } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Services/WorkflowRunner.cs b/src/core/Elsa.Core/Services/WorkflowRunner.cs index 0f6c743df..42218a7c9 100644 --- a/src/core/Elsa.Core/Services/WorkflowRunner.cs +++ b/src/core/Elsa.Core/Services/WorkflowRunner.cs @@ -148,7 +148,7 @@ namespace Elsa.Services object? input = default, CancellationToken cancellationToken = default) { - var workflowBlueprint = await _workflowRegistry.GetWorkflowAsync( + var workflowBlueprint = await _workflowRegistry.GetAsync( workflowInstance.DefinitionId, workflowInstance.TenantId, VersionOptions.SpecificVersion(workflowInstance.Version), diff --git a/src/core/Elsa.Core/Services/WorkflowTriggerInterruptor.cs b/src/core/Elsa.Core/Services/WorkflowTriggerInterruptor.cs index 573222753..0b043296b 100644 --- a/src/core/Elsa.Core/Services/WorkflowTriggerInterruptor.cs +++ b/src/core/Elsa.Core/Services/WorkflowTriggerInterruptor.cs @@ -64,7 +64,7 @@ namespace Elsa.Services await InterruptActivityTypeInternalAsync(activityType, input, cancellationToken).ToListAsync(cancellationToken); private async Task GetWorkflowBlueprintAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken) => - await _workflowRegistry.GetWorkflowAsync(workflowInstance.DefinitionId, workflowInstance.TenantId, VersionOptions.SpecificVersion(workflowInstance.Version), cancellationToken); + await _workflowRegistry.GetAsync(workflowInstance.DefinitionId, workflowInstance.TenantId, VersionOptions.SpecificVersion(workflowInstance.Version), cancellationToken); private async IAsyncEnumerable InterruptActivityTypeInternalAsync(string activityType, object? input, [EnumeratorCancellation] CancellationToken cancellationToken) { diff --git a/src/core/Elsa.Core/Triggers/TriggerIndexer.cs b/src/core/Elsa.Core/Triggers/TriggerIndexer.cs index 858f2ce29..3a9d32720 100644 --- a/src/core/Elsa.Core/Triggers/TriggerIndexer.cs +++ b/src/core/Elsa.Core/Triggers/TriggerIndexer.cs @@ -7,7 +7,6 @@ using System.Threading.Tasks; using Elsa.Bookmarks; using Elsa.Services; using Elsa.Services.Models; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace Elsa.Triggers @@ -43,7 +42,7 @@ namespace Elsa.Triggers public async Task IndexTriggersAsync(CancellationToken cancellationToken = default) { - var workflowBlueprints = await _workflowRegistry.GetWorkflowsAsync(cancellationToken).ToListAsync(cancellationToken); + var workflowBlueprints = await _workflowRegistry.ListAsync(cancellationToken); await IndexTriggersAsync(workflowBlueprints, cancellationToken); } diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.SqlServer/Migrations/ElsaContextModelSnapshot.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.SqlServer/Migrations/ElsaContextModelSnapshot.cs index 46e2e1020..859e7c4bf 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.SqlServer/Migrations/ElsaContextModelSnapshot.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.SqlServer/Migrations/ElsaContextModelSnapshot.cs @@ -3,8 +3,6 @@ using System; using Elsa.Persistence.EntityFramework.Core; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Elsa.Persistence.EntityFramework.SqlServer.Migrations { diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Sqlite/Migrations/ElsaContextModelSnapshot.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Sqlite/Migrations/ElsaContextModelSnapshot.cs index d1c75c1c4..6be6d03f7 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Sqlite/Migrations/ElsaContextModelSnapshot.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Sqlite/Migrations/ElsaContextModelSnapshot.cs @@ -3,7 +3,6 @@ using System; using Elsa.Persistence.EntityFramework.Core; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Elsa.Persistence.EntityFramework.Sqlite.Migrations { diff --git a/src/samples/worker/Elsa.Samples.Timers/Program.cs b/src/samples/worker/Elsa.Samples.Timers/Program.cs index cf079a628..f284f031c 100644 --- a/src/samples/worker/Elsa.Samples.Timers/Program.cs +++ b/src/samples/worker/Elsa.Samples.Timers/Program.cs @@ -6,7 +6,6 @@ using Elsa.Samples.Timers.Workflows; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using NodaTime; namespace Elsa.Samples.Timers { diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowRegistry/Get.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowRegistry/Get.cs index 503705308..57c8cbdb3 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowRegistry/Get.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowRegistry/Get.cs @@ -42,7 +42,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowRegistry public async Task> Handle(string id, VersionOptions? versionOptions = default, CancellationToken cancellationToken = default) { versionOptions ??= VersionOptions.Latest; - var workflowBlueprint = await _workflowRegistry.GetWorkflowAsync(id, null, versionOptions.Value, cancellationToken); + var workflowBlueprint = await _workflowRegistry.GetAsync(id, null, versionOptions.Value, cancellationToken); if (workflowBlueprint == null) return NotFound(); diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowRegistry/List.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowRegistry/List.cs index 194b4cb0e..1f819acce 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowRegistry/List.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowRegistry/List.cs @@ -10,6 +10,7 @@ using Elsa.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; +using Open.Linq.AsyncExtensions; using Swashbuckle.AspNetCore.Annotations; namespace Elsa.Server.Api.Endpoints.WorkflowRegistry @@ -42,7 +43,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowRegistry public async Task>> Handle(int? page = default, int? pageSize = default, VersionOptions? version = default, CancellationToken cancellationToken = default) { version ??= VersionOptions.Latest; - var workflowBlueprints = await _workflowRegistry.GetWorkflowsAsync(cancellationToken).Where(x => x.WithVersion(version.Value)).ToListAsync(cancellationToken); + var workflowBlueprints = await _workflowRegistry.FindManyAsync(x => x.WithVersion(version.Value), cancellationToken).ToList(); var totalCount = workflowBlueprints.Count; var skip = page * pageSize; var items = workflowBlueprints.AsEnumerable(); diff --git a/src/server/Elsa.Server.Api/Services/WorkflowBlueprintMapper.cs b/src/server/Elsa.Server.Api/Services/WorkflowBlueprintMapper.cs index e7b06e93c..b2a9e0dbf 100644 --- a/src/server/Elsa.Server.Api/Services/WorkflowBlueprintMapper.cs +++ b/src/server/Elsa.Server.Api/Services/WorkflowBlueprintMapper.cs @@ -1,5 +1,4 @@ -using System; -using System.Linq; +using System.Linq; using System.Threading; using System.Threading.Tasks; using AutoMapper;