diff --git a/Elsa.sln.DotSettings b/Elsa.sln.DotSettings index 6e5823092..dd47f2b84 100644 --- a/Elsa.sln.DotSettings +++ b/Elsa.sln.DotSettings @@ -11,6 +11,7 @@ True True True + True True True True diff --git a/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/ElsaOptionsExtensions.cs b/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/ElsaOptionsExtensions.cs index af40d25d3..a76822a1a 100644 --- a/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/ElsaOptionsExtensions.cs +++ b/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/ElsaOptionsExtensions.cs @@ -8,17 +8,20 @@ namespace Elsa public static class ElsaOptionsExtensions { /// - /// Adds temporal (time-based) activities to Elsa, using the Quartz implementation. + /// Adds temporal (time-based) activities to Elsa using the Quartz implementation. Also registers Quartz services itself. /// /// Elsa options - /// An optional Quartz configuration callback + /// /// An optional service collection Quartz configuration callback + /// Use this callback to further configure the Quartz hosted service /// The Elsa options, enabling method chaining - public static ElsaOptions AddQuartzTemporalActivities(this ElsaOptions options, - Action? configure = default, - Action? configureQuartz = default) + public static ElsaOptions AddQuartzTemporalActivities( + this ElsaOptions options, + Action? configureQuartzOptions = default, + Action? configureQuartz = default, + Action? configureQuartzHostedService = default) { - CommonTemporalActivityServices.AddCommonTemporalActivities(options, timer => timer.UseQuartzProvider(configure, configureQuartz)); + CommonTemporalActivityServices.AddCommonTemporalActivities(options, timer => timer.UseQuartzProvider(true, configureQuartzOptions, configureQuartz, configureQuartzHostedService)); return options; } } diff --git a/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/TimersOptionsExtensions.cs b/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/TimersOptionsExtensions.cs index 5332c9989..754261939 100644 --- a/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/TimersOptionsExtensions.cs +++ b/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/TimersOptionsExtensions.cs @@ -12,34 +12,34 @@ namespace Elsa public static class TimersOptionsExtensions { /// - /// Add Elsa Quartz services. + /// Add Elsa Quartz services and Quartz services. /// - public static void UseQuartzProvider(this TimersOptions timersOptions) + /// The timer options being configured. + /// True to automatically register Quartz services. When false, make sure to register Quartz yourself. + /// When is true, you can use this callback to further configure Quartz options. + /// When is true, you can use this callback to further configure Quartz. + /// When is true, you can use this callback to further configure the Quartz hosted service. + public static void UseQuartzProvider( + this TimersOptions timersOptions, + bool registerQuartz = true, + Action? configureQuartzOptions = default, + Action? configureQuartz = default, + Action? configureQuartzHostedService = default) { timersOptions.Services .AddSingleton() .AddSingleton() .AddTransient(); - } - /// - /// Add Elsa Hangfire Services and Quartz services. - /// - /// - /// Use only if Quartz is not already registered in DI. - /// - public static void UseQuartzProvider( - this TimersOptions timersOptions, - Action configureOptions, - Action? configureQuartz = default, - Action? configureQuartzHostedService = default) - { - timersOptions.UseQuartzProvider(); - timersOptions.Services.Configure(configureOptions); - - timersOptions.Services - .AddQuartz(configure => ConfigureQuartz(configure, configureQuartz)) - .AddQuartzHostedService(options => ConfigureQuartzHostedService(options, configureQuartzHostedService)); + if (registerQuartz) + { + if (configureQuartzOptions != null) + timersOptions.Services.Configure(configureQuartzOptions); + + timersOptions.Services + .AddQuartz(configure => ConfigureQuartz(configure, configureQuartz)) + .AddQuartzHostedService(options => ConfigureQuartzHostedService(options, configureQuartzHostedService)); + } } private static void ConfigureQuartzHostedService(QuartzHostedServiceOptions options, Action? configureQuartzHostedService) @@ -54,7 +54,7 @@ namespace Elsa quartz.AddJob(job => job.StoreDurably().WithIdentity(nameof(RunQuartzWorkflowJob))); quartz.UseSimpleTypeLoader(); quartz.UseInMemoryStore(); - + configureQuartz?.Invoke(quartz); } } diff --git a/test/integration/Elsa.Core.IntegrationTests/Autofixture/HostBuilderWithElsaAndQuartzAttribute.cs b/test/integration/Elsa.Core.IntegrationTests/Autofixture/HostBuilderWithElsaAndQuartzAttribute.cs index 04df15bb0..ae641f89e 100644 --- a/test/integration/Elsa.Core.IntegrationTests/Autofixture/HostBuilderWithElsaAndQuartzAttribute.cs +++ b/test/integration/Elsa.Core.IntegrationTests/Autofixture/HostBuilderWithElsaAndQuartzAttribute.cs @@ -4,7 +4,7 @@ using AutoFixture.Xunit2; using Elsa.Testing.Shared.AutoFixture.Customizations; using Microsoft.Extensions.DependencyInjection; -namespace Elsa.Core.IntegrationTests.Extensions +namespace Elsa.Core.IntegrationTests.Autofixture { public class HostBuilderWithElsaAndQuartzAttribute : CustomizeAttribute { diff --git a/test/integration/Elsa.Core.IntegrationTests/Extensions/TemporalServiceCollectionExtensionsTests.cs b/test/integration/Elsa.Core.IntegrationTests/Extensions/TemporalServiceCollectionExtensionsTests.cs index 922298e5a..449e353da 100644 --- a/test/integration/Elsa.Core.IntegrationTests/Extensions/TemporalServiceCollectionExtensionsTests.cs +++ b/test/integration/Elsa.Core.IntegrationTests/Extensions/TemporalServiceCollectionExtensionsTests.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Hosting; using Xunit; using System.Threading.Tasks; using System.Threading; +using Elsa.Core.IntegrationTests.Autofixture; using Elsa.Core.IntegrationTests.Extensions; namespace Elsa.UnitTests.Extensions diff --git a/test/unit/Elsa.UnitTests/Services/ActivityExecutionContextForActivityBlueprintFactoryTests.cs b/test/unit/Elsa.UnitTests/Services/ActivityExecutionContextForActivityBlueprintFactoryTests.cs index 8949c53a0..2064ca30f 100644 --- a/test/unit/Elsa.UnitTests/Services/ActivityExecutionContextForActivityBlueprintFactoryTests.cs +++ b/test/unit/Elsa.UnitTests/Services/ActivityExecutionContextForActivityBlueprintFactoryTests.cs @@ -9,10 +9,11 @@ namespace Elsa.Services public class ActivityExecutionContextForActivityBlueprintFactoryTests { [Theory(DisplayName = "The CreateActivityExecutionContext method should create a context using the activity blueprint, the workflow execution context, cancellation token and injected service provider."), AutoMoqData] - public void CreateActivityExecutionContextCreatesContextUsingBlueprintExecutionContextCancellationTokenAndServiceProvider([AutofixtureServiceProvider] IServiceProvider serviceProvider, - IActivityBlueprint activityBlueprint, - [OmitOnRecursion] WorkflowExecutionContext workflowExecutionContext, - CancellationToken cancellationToken) + public void CreateActivityExecutionContextCreatesContextUsingBlueprintExecutionContextCancellationTokenAndServiceProvider( + [AutofixtureServiceProvider] IServiceProvider serviceProvider, + IActivityBlueprint activityBlueprint, + [OmitOnRecursion] WorkflowExecutionContext workflowExecutionContext, + CancellationToken cancellationToken) { var sut = new ActivityExecutionContextForActivityBlueprintFactory(serviceProvider); diff --git a/test/unit/Elsa.UnitTests/Services/Models/ActivityExecutionContextTests.cs b/test/unit/Elsa.UnitTests/Services/Models/ActivityExecutionContextTests.cs index 33f70a1b7..80b43b50f 100644 --- a/test/unit/Elsa.UnitTests/Services/Models/ActivityExecutionContextTests.cs +++ b/test/unit/Elsa.UnitTests/Services/Models/ActivityExecutionContextTests.cs @@ -2,6 +2,7 @@ using Xunit; using Elsa.Testing.Shared.AutoFixture.Attributes; using AutoFixture.Xunit2; using System; +using System.Threading; namespace Elsa.Services.Models { @@ -9,12 +10,15 @@ namespace Elsa.Services.Models { [Theory(DisplayName = "The PurgeVariables method should clear the Variables instance associated with the WorkflowInstance associated with the Workflow Execution Context"), AutoMoqData] public void PurgeVariables_clears_workflow_execution_context_workflow_instance_variables( - [OmitOnRecursion, NoAutoProperties] ActivityExecutionContext sut, + [AutofixtureServiceProvider] IServiceProvider serviceProvider, + [OmitOnRecursion] WorkflowExecutionContext workflowExecutionContext, + IActivityBlueprint activityBlueprint, + CancellationToken cancellationToken, string variableName, object variableValue) { + var sut = new ActivityExecutionContext(serviceProvider, workflowExecutionContext, activityBlueprint, null, false, cancellationToken); sut.WorkflowExecutionContext.WorkflowInstance.Variables.Set(variableName, variableValue); - sut.PurgeVariables(); Assert.Empty(sut.WorkflowExecutionContext.WorkflowInstance.Variables.Data); diff --git a/test/unit/Elsa.UnitTests/Services/Models/WorkflowExecutionContextTests.cs b/test/unit/Elsa.UnitTests/Services/Models/WorkflowExecutionContextTests.cs index e917f697e..dcc32fe54 100644 --- a/test/unit/Elsa.UnitTests/Services/Models/WorkflowExecutionContextTests.cs +++ b/test/unit/Elsa.UnitTests/Services/Models/WorkflowExecutionContextTests.cs @@ -2,6 +2,7 @@ using Xunit; using Elsa.Testing.Shared.AutoFixture.Attributes; using AutoFixture.Xunit2; using System; +using System.Threading; namespace Elsa.Services.Models { @@ -9,10 +10,14 @@ namespace Elsa.Services.Models { [Theory(DisplayName = "The PurgeVariables method should clear the Variables instance associated with the WorkflowInstance"), AutoMoqData] public void PurgeVariables_clears_workflow_execution_context_workflow_instance_variables( - [OmitOnRecursion, NoAutoProperties] WorkflowExecutionContext sut, + [AutofixtureServiceProvider] IServiceProvider serviceProvider, + [OmitOnRecursion] WorkflowExecutionContext workflowExecutionContext, + IActivityBlueprint activityBlueprint, + CancellationToken cancellationToken, string variableName, object variableValue) { + var sut = new ActivityExecutionContext(serviceProvider, workflowExecutionContext, activityBlueprint, null, false, cancellationToken); sut.WorkflowInstance.Variables.Set(variableName, variableValue); sut.PurgeVariables();