< Summary

Information
Class: Elsa.Workflows.Features.WorkflowsFeature
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Features/WorkflowsFeature.cs
Line coverage
92%
Covered lines: 119
Uncovered lines: 9
Coverable lines: 128
Total lines: 262
Line coverage: 92.9%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Features/WorkflowsFeature.cs

#LineLine coverage
 1using Elsa.Common;
 2using Elsa.Common.Features;
 3using Elsa.Common.Serialization;
 4using Elsa.Expressions.Features;
 5using Elsa.Extensions;
 6using Elsa.Features.Abstractions;
 7using Elsa.Features.Attributes;
 8using Elsa.Features.Services;
 9using Elsa.Workflows.ActivationValidators;
 10using Elsa.Workflows.Builders;
 11using Elsa.Workflows.CommitStates;
 12using Elsa.Workflows.IncidentStrategies;
 13using Elsa.Workflows.LogPersistence;
 14using Elsa.Workflows.LogPersistence.Strategies;
 15using Elsa.Workflows.Middleware.Activities;
 16using Elsa.Workflows.Middleware.Workflows;
 17using Elsa.Workflows.Pipelines.ActivityExecution;
 18using Elsa.Workflows.Pipelines.WorkflowExecution;
 19using Elsa.Workflows.PortResolvers;
 20using Elsa.Workflows.Serialization.Configurators;
 21using Elsa.Workflows.Serialization.Helpers;
 22using Elsa.Workflows.Serialization.Serializers;
 23using Elsa.Workflows.Services;
 24using Elsa.Workflows.UIHints.CheckList;
 25using Elsa.Workflows.UIHints.Dictionary;
 26using Elsa.Workflows.UIHints.Dropdown;
 27using Elsa.Workflows.UIHints.JsonEditor;
 28using Elsa.Workflows.UIHints.RadioList;
 29using Microsoft.Extensions.DependencyInjection;
 30
 31namespace Elsa.Workflows.Features;
 32
 33/// <summary>
 34/// Adds workflow services to the system.
 35/// </summary>
 36[DependsOn(typeof(SystemClockFeature))]
 37[DependsOn(typeof(ExpressionsFeature))]
 38[DependsOn(typeof(MediatorFeature))]
 39[DependsOn(typeof(DefaultFormattersFeature))]
 40[DependsOn(typeof(MultitenancyFeature))]
 41[DependsOn(typeof(CommitStrategiesFeature))]
 42public class WorkflowsFeature : FeatureBase
 43{
 44    /// <inheritdoc />
 12645    public WorkflowsFeature(IModule module) : base(module)
 46    {
 12647    }
 48
 49    /// <summary>
 50    /// A factory that instantiates a concrete <see cref="IStandardInStreamProvider"/>.
 51    /// </summary>
 25252    public Func<IServiceProvider, IStandardInStreamProvider> StandardInStreamProvider { get; set; } = _ => new StandardI
 53
 54    /// <summary>
 55    /// A factory that instantiates a concrete <see cref="IStandardOutStreamProvider"/>.
 56    /// </summary>
 75157    public Func<IServiceProvider, IStandardOutStreamProvider> StandardOutStreamProvider { get; set; } = _ => new Standar
 58
 59    /// <summary>
 60    /// A factory that instantiates a concrete <see cref="IIdentityGenerator"/>.
 61    /// </summary>
 37862    public Func<IServiceProvider, IIdentityGenerator> IdentityGenerator { get; set; } = sp => new RandomLongIdentityGene
 63
 64    /// <summary>
 65    /// A handler for committing workflow execution state.
 66    /// </summary>
 37867    public Func<IServiceProvider, ICommitStateHandler> CommitStateHandler { get; set; } = sp => new NoopCommitStateHandl
 68
 69    /// <summary>
 70    /// A factory that instantiates a concrete <see cref="ILoggerStateGenerator{WorkflowExecutionContext}"/>.
 71    /// </summary>
 37672    public Func<IServiceProvider, ILoggerStateGenerator<WorkflowExecutionContext>> WorkflowLoggerStateGenerator { get; s
 73
 74    /// <summary>
 75    /// A factory that instantiates a concrete <see cref="ILoggerStateGenerator{ActivityExecutionContext}"/>.
 76    /// </summary>
 37877    public Func<IServiceProvider, ILoggerStateGenerator<ActivityExecutionContext>> ActivityLoggerStateGenerator { get; s
 78
 79    /// <summary>
 80    /// A delegate to configure the <see cref="IWorkflowExecutionPipeline"/>.
 81    /// </summary>
 75082    public Action<IWorkflowExecutionPipelineBuilder> WorkflowExecutionPipeline { get; set; } = builder => builder
 12683        .UseExceptionHandling()
 12684        .UseDefaultActivityScheduler();
 85
 86    /// <summary>
 87    /// A delegate to configure the <see cref="IActivityExecutionPipeline"/>.
 88    /// </summary>
 75089    public Action<IActivityExecutionPipelineBuilder> ActivityExecutionPipeline { get; set; } = builder => builder.UseDef
 90
 91    /// <summary>
 92    /// Fluent method to set <see cref="StandardInStreamProvider"/>.
 93    /// </summary>
 94    public WorkflowsFeature WithStandardInStreamProvider(Func<IServiceProvider, IStandardInStreamProvider> provider)
 95    {
 096        StandardInStreamProvider = provider;
 097        return this;
 98    }
 99
 100    /// <summary>
 101    /// Fluent method to set <see cref="StandardOutStreamProvider"/>.
 102    /// </summary>
 103    public WorkflowsFeature WithStandardOutStreamProvider(Func<IServiceProvider, IStandardOutStreamProvider> provider)
 104    {
 245105        StandardOutStreamProvider = provider;
 245106        return this;
 107    }
 108
 109    /// <summary>
 110    /// Fluent method to set <see cref="IdentityGenerator"/>.
 111    /// </summary>
 112    public WorkflowsFeature WithIdentityGenerator(Func<IServiceProvider, IIdentityGenerator> generator)
 113    {
 0114        IdentityGenerator = generator;
 0115        return this;
 116    }
 117
 118    /// <summary>
 119    /// Fluent method to set <see cref="ILoggerStateGenerator{WorkflowExecutionContext}"/>.
 120    /// </summary>
 121    public WorkflowsFeature WithWorkflowLoggerStateGenerator(Func<IServiceProvider, ILoggerStateGenerator<WorkflowExecut
 122    {
 0123        WorkflowLoggerStateGenerator = generator;
 0124        return this;
 125    }
 126
 127    /// <summary>
 128    /// Fluent method to set <see cref="ILoggerStateGenerator{ActivityExecutionContext}"/>.
 129    /// </summary>
 130    public WorkflowsFeature WithActivityLoggerStateGenerator(Func<IServiceProvider, ILoggerStateGenerator<ActivityExecut
 131    {
 0132        ActivityLoggerStateGenerator = generator;
 0133        return this;
 134    }
 135
 136    /// <summary>
 137    /// Fluent method to configure the <see cref="IWorkflowExecutionPipeline"/>.
 138    /// </summary>
 139    public WorkflowsFeature WithWorkflowExecutionPipeline(Action<IWorkflowExecutionPipelineBuilder> setup)
 140    {
 126141        WorkflowExecutionPipeline = setup;
 126142        return this;
 143    }
 144
 145    /// <summary>
 146    /// Fluent method to configure the <see cref="IActivityExecutionPipeline"/>.
 147    /// </summary>
 148    public WorkflowsFeature WithActivityExecutionPipeline(Action<IActivityExecutionPipelineBuilder> setup)
 149    {
 126150        ActivityExecutionPipeline = setup;
 126151        return this;
 152    }
 153
 154    /// <inheritdoc />
 155    public override void Apply()
 156    {
 126157        AddElsaCore(Services);
 126158    }
 159
 160    private void AddElsaCore(IServiceCollection services)
 161    {
 126162        services
 126163
 126164            // Core.
 126165            .AddScoped<IActivityInvoker, ActivityInvoker>()
 126166            .AddScoped<IWorkflowRunner, WorkflowRunner>()
 126167            .AddScoped<IActivityTestRunner, ActivityTestRunner>()
 126168            .AddScoped<IActivityVisitor, ActivityVisitor>()
 126169            .AddScoped<IIdentityGraphService, IdentityGraphService>()
 126170            .AddScoped<IWorkflowGraphBuilder, WorkflowGraphBuilder>()
 126171            .AddScoped<IWorkflowStateExtractor, WorkflowStateExtractor>()
 126172            .AddScoped<IActivitySchedulerFactory, ActivitySchedulerFactory>()
 126173            .AddSingleton<IWorkflowExecutionContextSchedulerStrategy, WorkflowExecutionContextSchedulerStrategy>()
 126174            .AddSingleton<IActivityExecutionContextSchedulerStrategy, ActivityExecutionContextSchedulerStrategy>()
 126175            .AddScoped(CommitStateHandler)
 126176            .AddSingleton<IHasher, Hasher>()
 126177            .AddSingleton<IStimulusHasher, StimulusHasher>()
 126178            .AddSingleton(IdentityGenerator)
 0179            .AddSingleton<IBookmarkPayloadSerializer>(sp => ActivatorUtilities.CreateInstance<BookmarkPayloadSerializer>
 126180            .AddSingleton<IActivityDescriber, ActivityDescriber>()
 126181            .AddSingleton<IActivityRegistry, ActivityRegistry>()
 126182            .AddScoped<IActivityRegistryLookupService, ActivityRegistryLookupService>()
 126183            .AddSingleton<IPropertyDefaultValueResolver, PropertyDefaultValueResolver>()
 126184            .AddSingleton<IPropertyUIHandlerResolver, PropertyUIHandlerResolver>()
 126185            .AddSingleton<IActivityFactory, ActivityFactory>()
 126186            .AddTransient<WorkflowBuilder>()
 4381187            .AddScoped(typeof(Func<IWorkflowBuilder>), sp => () => sp.GetRequiredService<WorkflowBuilder>())
 126188            .AddScoped<IWorkflowBuilderFactory, WorkflowBuilderFactory>()
 126189            .AddScoped<IVariablePersistenceManager, VariablePersistenceManager>()
 126190            .AddScoped<IIncidentStrategyResolver, DefaultIncidentStrategyResolver>()
 126191            .AddScoped<IActivityStateFilterManager, DefaultActivityStateFilterManager>()
 126192            .AddScoped<IWorkflowInstanceVariableReader, DefaultWorkflowInstanceVariableReader>()
 126193            .AddScoped<IWorkflowInstanceVariableWriter, DefaultWorkflowInstanceVariableWriter>()
 126194            .AddScoped<DefaultActivityInputEvaluator>()
 126195
 126196            // Incident Strategies.
 126197            .AddTransient<IIncidentStrategy, FaultStrategy>()
 126198            .AddTransient<IIncidentStrategy, ContinueWithIncidentsStrategy>()
 126199
 126200            // Pipelines.
 498201            .AddScoped<IActivityExecutionPipeline>(sp => new ActivityExecutionPipeline(sp, ActivityExecutionPipeline))
 498202            .AddScoped<IWorkflowExecutionPipeline>(sp => new WorkflowExecutionPipeline(sp, WorkflowExecutionPipeline))
 126203
 126204            // Built-in activity services.
 126205            .AddScoped<IActivityResolver, PropertyBasedActivityResolver>()
 126206            .AddScoped<IActivityResolver, SwitchActivityResolver>()
 126207            .AddSerializationOptionsConfigurator<AdditionalConvertersConfigurator>()
 126208            .AddSerializationOptionsConfigurator<CustomConstructorConfigurator>()
 126209
 126210            // Domain event handlers.
 126211            .AddHandlersFrom<WorkflowsFeature>()
 126212
 126213            // Stream providers.
 126214            .AddScoped(StandardInStreamProvider)
 126215            .AddScoped(StandardOutStreamProvider)
 126216
 126217            // Storage drivers.
 126218            .AddScoped<IStorageDriverManager, StorageDriverManager>()
 126219            .AddStorageDriver<WorkflowStorageDriver>()
 126220            .AddStorageDriver<WorkflowInstanceStorageDriver>()
 126221            .AddStorageDriver<MemoryStorageDriver>()
 126222
 126223            // Serialization.
 126224            .AddSingleton<IWorkflowStateSerializer, JsonWorkflowStateSerializer>()
 126225            .AddSingleton<IPayloadSerializer, JsonPayloadSerializer>()
 126226            .AddSingleton<IActivitySerializer, JsonActivitySerializer>()
 126227            .AddSingleton<IApiSerializer, ApiSerializer>()
 126228            .AddSingleton<ISafeSerializer, SafeSerializer>()
 126229            .AddSingleton<IJsonSerializer, StandardJsonSerializer>()
 126230            .AddSingleton<SyntheticPropertiesWriter>()
 126231            .AddSingleton<ActivityWriter>()
 126232
 126233            // Instantiation strategies.
 126234            .AddScoped<IWorkflowActivationStrategy, AllowAlwaysStrategy>()
 126235
 126236            // UI.
 126237            .AddScoped<IUIHintHandler, DropDownUIHintHandler>()
 126238            .AddScoped<IUIHintHandler, CheckListUIHintHandler>()
 126239            .AddScoped<IUIHintHandler, RadioListUIHintHandler>()
 126240            .AddScoped<IUIHintHandler, JsonEditorUIHintHandler>()
 126241            .AddScoped<IPropertyUIHandler, StaticCheckListOptionsProvider>()
 126242            .AddScoped<IPropertyUIHandler, StaticRadioListOptionsProvider>()
 126243            .AddScoped<IPropertyUIHandler, StaticDropDownOptionsProvider>()
 126244            .AddScoped<IPropertyUIHandler, JsonCodeOptionsProvider>()
 126245            .AddScoped<DictionaryValueEvaluator>()
 126246            .AddSingleton<IActivityDescriptorModifier, DictionaryUIHintInputModifier>()
 126247
 126248            // Logger state generators.
 126249            .AddSingleton(WorkflowLoggerStateGenerator)
 126250            .AddSingleton(ActivityLoggerStateGenerator)
 126251
 126252            // Log Persistence Strategies.
 126253            .AddScoped<ILogPersistenceStrategyService, DefaultLogPersistenceStrategyService>()
 126254            .AddScoped<ILogPersistenceStrategy, Include>()
 126255            .AddScoped<ILogPersistenceStrategy, Exclude>()
 126256            .AddScoped<ILogPersistenceStrategy, Inherit>()
 126257            .AddScoped<ILogPersistenceStrategy, Configuration>()
 126258
 126259            // Logging
 126260            .AddLogging();
 126261    }
 262}