< Summary

Information
Class: Elsa.Workflows.ShellFeatures.WorkflowsFeature
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/ShellFeatures/WorkflowsFeature.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 151
Coverable lines: 151
Total lines: 236
Line coverage: 0%
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/ShellFeatures/WorkflowsFeature.cs

#LineLine coverage
 1using CShells.Features;
 2using Elsa.Common.Serialization;
 3using Elsa.Common.ShellFeatures;
 4using Elsa.Common;
 5using Elsa.Expressions.ShellFeatures;
 6using Elsa.Extensions;
 7using Elsa.Workflows.ActivationValidators;
 8using Elsa.Workflows.Activities.Flowchart.Models;
 9using Elsa.Workflows.Activities.Flowchart.Options;
 10using Elsa.Workflows.Activities.Flowchart.Serialization;
 11using Elsa.Workflows.Builders;
 12using Elsa.Workflows.CommitStates;
 13using Elsa.Workflows.Exceptions;
 14using Elsa.Workflows.IncidentStrategies;
 15using Elsa.Workflows.LogPersistence.Strategies;
 16using Elsa.Workflows.LogPersistence;
 17using Elsa.Workflows.Middleware.Activities;
 18using Elsa.Workflows.Middleware.Workflows;
 19using Elsa.Workflows.Options;
 20using Elsa.Workflows.Pipelines.ActivityExecution;
 21using Elsa.Workflows.Pipelines.WorkflowExecution;
 22using Elsa.Workflows.PortResolvers;
 23using Elsa.Workflows.Serialization.Configurators;
 24using Elsa.Workflows.Serialization.Helpers;
 25using Elsa.Workflows.Serialization.Serializers;
 26using Elsa.Workflows.Services;
 27using Elsa.Workflows.State;
 28using Elsa.Workflows.UIHints.CheckList;
 29using Elsa.Workflows.UIHints.Dictionary;
 30using Elsa.Workflows.UIHints.Dropdown;
 31using Elsa.Workflows.UIHints.JsonEditor;
 32using Elsa.Workflows.UIHints.RadioList;
 33using Elsa.Platform.PackageManifest.Generator.Hints;
 34using Microsoft.Extensions.DependencyInjection;
 35using Microsoft.Extensions.DependencyInjection.Extensions;
 36using Newtonsoft.Json.Linq;
 37
 38namespace Elsa.Workflows.ShellFeatures;
 39
 40[ManifestFeatureCategory("Workflows")]
 41[ShellFeature(
 42    DisplayName = "Workflows",
 43    Description = "Provides core workflow execution, activity execution, and workflow serialization services",
 44    DependsOn =
 45[
 46    typeof(SystemClockFeature),
 47    typeof(ExpressionsFeature),
 48    typeof(MediatorFeature),
 49    typeof(DefaultFormattersFeature),
 50    typeof(MultitenancyFeature),
 51    typeof(CommitStrategiesFeature)
 52])]
 53public class WorkflowsFeature : IShellFeature
 54{
 55    /// <summary>
 56    /// A delegate to configure the <see cref="IWorkflowExecutionPipeline"/>.
 57    /// </summary>
 058    public Action<IWorkflowExecutionPipelineBuilder> WorkflowExecutionPipeline { get; set; } = builder => builder
 059        .UseExceptionHandling()
 060        .UseDefaultActivityScheduler();
 61
 62    /// <summary>
 63    /// A delegate to configure the <see cref="IActivityExecutionPipeline"/>.
 64    /// </summary>
 065    public Action<IActivityExecutionPipelineBuilder> ActivityExecutionPipeline { get; set; } = builder => builder
 066        .UseLogging()
 067        .UseExceptionHandling()
 068        .UseExecutionLogging()
 069        .UseNotifications()
 070        .UseDefaultActivityInvoker();
 71
 72    /// <summary>
 73    /// A factory that instantiates a concrete <see cref="IStandardInStreamProvider"/>.
 74    /// </summary>
 075    public Func<IServiceProvider, IStandardInStreamProvider> StandardInStreamProvider { get; set; } = _ => new StandardI
 76
 77    /// <summary>
 78    /// A factory that instantiates a concrete <see cref="IStandardOutStreamProvider"/>.
 79    /// </summary>
 080    public Func<IServiceProvider, IStandardOutStreamProvider> StandardOutStreamProvider { get; set; } = _ => new Standar
 81
 82    /// <summary>
 83    /// A factory that instantiates a concrete <see cref="ILoggerStateGenerator{WorkflowExecutionContext}"/>.
 84    /// </summary>
 085    public Func<IServiceProvider, ILoggerStateGenerator<WorkflowExecutionContext>> WorkflowLoggerStateGenerator { get; s
 86
 87    /// <summary>
 88    /// A factory that instantiates a concrete <see cref="ILoggerStateGenerator{ActivityExecutionContext}"/>.
 89    /// </summary>
 090    public Func<IServiceProvider, ILoggerStateGenerator<ActivityExecutionContext>> ActivityLoggerStateGenerator { get; s
 91
 92    public void ConfigureServices(IServiceCollection services)
 93    {
 094        services.Configure<SerializationTypeOptions>(options =>
 095        {
 096            options.AddTypeAlias<ExceptionState>(nameof(ExceptionState));
 097            options.AddTypeAlias<FaultException>(nameof(FaultException));
 098            options.AddTypeAlias<VariablesDictionary>(nameof(VariablesDictionary));
 099            options.AddTypeAlias<Token>(nameof(Token));
 0100            options.RegisterLegacyTypeName(typeof(FlowJoinMode), "Elsa.Workflows.Core.Activities.Flowchart.Models.FlowJo
 0101            options.AddTypeAliasWithLegacyName<FlowJoinMode>(nameof(FlowJoinMode));
 0102            options.AddTypeAliasWithLegacyName<WorkflowStorageDriver>(nameof(WorkflowStorageDriver));
 0103            options.AddTypeAliasWithLegacyName<WorkflowInstanceStorageDriver>(nameof(WorkflowInstanceStorageDriver));
 0104            options.AddTypeAliasWithLegacyName<MemoryStorageDriver>(nameof(MemoryStorageDriver));
 0105            options.AddTypeAliasWithLegacyName<FaultStrategy>(nameof(FaultStrategy));
 0106            options.AddTypeAliasWithLegacyName<ContinueWithIncidentsStrategy>(nameof(ContinueWithIncidentsStrategy));
 0107            options.AddTypeAlias<Exception>(nameof(Exception));
 0108            options.AddTypeAlias<ArgumentException>(nameof(ArgumentException));
 0109            options.AddTypeAlias<ArgumentNullException>(nameof(ArgumentNullException));
 0110            options.AddTypeAlias<InvalidOperationException>(nameof(InvalidOperationException));
 0111            options.AddTypeAlias<NullReferenceException>(nameof(NullReferenceException));
 0112            options.AddTypeAlias<OperationCanceledException>(nameof(OperationCanceledException));
 0113            options.AddTypeAlias<TaskCanceledException>(nameof(TaskCanceledException));
 0114            options.AddTypeAlias<TimeoutException>(nameof(TimeoutException));
 0115            options.AddTypeAlias<NotSupportedException>(nameof(NotSupportedException));
 0116            options.AddTypeAlias<JObject>(nameof(JObject));
 0117            options.AddTypeAlias<JArray>(nameof(JArray));
 0118        });
 119
 0120        services.TryAddSingleton<IOutputConverterRegistry, OutputConverterRegistry>();
 121
 0122        services
 0123            // Core.
 0124            .AddScoped<IActivityInvoker, ActivityInvoker>()
 0125            .AddScoped<IWorkflowRunner, WorkflowRunner>()
 0126            .AddScoped<IActivityTestRunner, ActivityTestRunner>()
 0127            .AddScoped<IActivityVisitor, ActivityVisitor>()
 0128            .AddScoped<IIdentityGraphService, IdentityGraphService>()
 0129            .AddScoped<IWorkflowGraphBuilder, WorkflowGraphBuilder>()
 0130            .AddScoped<IWorkflowStateExtractor, WorkflowStateExtractor>()
 0131            .AddScoped<IActivitySchedulerFactory, ActivitySchedulerFactory>()
 0132            .AddSingleton<IWorkflowExecutionContextSchedulerStrategy, WorkflowExecutionContextSchedulerStrategy>()
 0133            .AddSingleton<IActivityExecutionContextSchedulerStrategy, ActivityExecutionContextSchedulerStrategy>()
 0134            .AddSingleton<IHasher, Hasher>()
 0135            .AddSingleton<IStimulusHasher, StimulusHasher>()
 0136            .AddSingleton<IIdentityGenerator, ShortGuidIdentityGenerator>()
 0137            .AddSingleton<IBookmarkPayloadSerializer>(sp => ActivatorUtilities.CreateInstance<BookmarkPayloadSerializer>
 0138            .AddSingleton<IActivityDescriber, ActivityDescriber>()
 0139            .AddSingleton<IActivityRegistry, ActivityRegistry>()
 0140            .AddScoped<IActivityRegistryLookupService, ActivityRegistryLookupService>()
 0141            .AddScoped<IOutputBindingDestinationResolver, OutputBindingDestinationResolver>()
 0142            .AddSingleton<IOutputConverterSettingsValidator, OutputConverterSettingsValidator>()
 0143            .AddScoped<IOutputConverterInvoker, OutputConverterInvoker>()
 0144            .AddSingleton<IPropertyDefaultValueResolver, PropertyDefaultValueResolver>()
 0145            .AddSingleton<IPropertyUIHandlerResolver, PropertyUIHandlerResolver>()
 0146            .AddSingleton<IActivityFactory, ActivityFactory>()
 0147            .AddTransient<WorkflowBuilder>()
 0148            .AddScoped(typeof(Func<IWorkflowBuilder>), sp => () => sp.GetRequiredService<WorkflowBuilder>())
 0149            .AddScoped<IWorkflowBuilderFactory, WorkflowBuilderFactory>()
 0150            .AddScoped<IVariablePersistenceManager, VariablePersistenceManager>()
 0151            .AddScoped<IIncidentStrategyResolver, DefaultIncidentStrategyResolver>()
 0152            .AddScoped<IActivityStateFilterManager, DefaultActivityStateFilterManager>()
 0153            .AddScoped<IWorkflowInstanceVariableReader, DefaultWorkflowInstanceVariableReader>()
 0154            .AddScoped<IWorkflowInstanceVariableWriter, DefaultWorkflowInstanceVariableWriter>()
 0155            .AddScoped<DefaultActivityInputEvaluator>()
 0156
 0157            // Incident Strategies.
 0158            .AddTransient<IIncidentStrategy, FaultStrategy>()
 0159            .AddTransient<IIncidentStrategy, ContinueWithIncidentsStrategy>()
 0160
 0161            // Pipelines.
 0162            .AddScoped<IActivityExecutionPipeline>(sp => new ActivityExecutionPipeline(sp, builder =>
 0163            {
 0164                builder.UseActivityExecutionPipelineContributors(sp);
 0165                ActivityExecutionPipeline(builder);
 0166            }))
 0167            .AddScoped<IWorkflowExecutionPipeline>(sp => new WorkflowExecutionPipeline(sp, builder =>
 0168            {
 0169                builder.UseWorkflowExecutionPipelineContributors(sp);
 0170                WorkflowExecutionPipeline(builder);
 0171            }))
 0172
 0173            // Built-in activity services.
 0174            .AddScoped<IActivityResolver, PropertyBasedActivityResolver>()
 0175            .AddScoped<IActivityResolver, SwitchActivityResolver>()
 0176            .AddSerializationOptionsConfigurator<AdditionalConvertersConfigurator>()
 0177            .AddSerializationOptionsConfigurator<CustomConstructorConfigurator>()
 0178            .AddSerializationOptionsConfigurator<FlowchartSerializationOptionConfigurator>()
 0179
 0180            // Domain event handlers.
 0181            .AddHandlersFrom<WorkflowsFeature>()
 0182
 0183            // Stream providers.
 0184            .AddScoped(StandardInStreamProvider)
 0185            .AddScoped(StandardOutStreamProvider)
 0186
 0187            // Storage drivers.
 0188            .AddScoped<IStorageDriverManager, StorageDriverManager>()
 0189            .AddStorageDriver<WorkflowStorageDriver>()
 0190            .AddStorageDriver<WorkflowInstanceStorageDriver>()
 0191            .AddStorageDriver<MemoryStorageDriver>()
 0192
 0193            // Serialization.
 0194            .AddSingleton<ISerializationTypeRegistry, SerializationTypeRegistry>()
 0195            .AddSingleton<IWorkflowStateSerializer, JsonWorkflowStateSerializer>()
 0196            .AddSingleton<IPayloadSerializer, JsonPayloadSerializer>()
 0197            .AddSingleton<IActivitySerializer, JsonActivitySerializer>()
 0198            .AddSingleton<IApiSerializer, ApiSerializer>()
 0199            .AddSingleton<ISafeSerializer, SafeSerializer>()
 0200            .AddSingleton<IJsonSerializer, StandardJsonSerializer>()
 0201            .AddSingleton<SyntheticPropertiesWriter>()
 0202            .AddSingleton<ActivityWriter>()
 0203
 0204            // Instantiation strategies.
 0205            .AddScoped<IWorkflowActivationStrategy, AllowAlwaysStrategy>()
 0206
 0207            // UI.
 0208            .AddScoped<IUIHintHandler, DropDownUIHintHandler>()
 0209            .AddScoped<IUIHintHandler, CheckListUIHintHandler>()
 0210            .AddScoped<IUIHintHandler, RadioListUIHintHandler>()
 0211            .AddScoped<IUIHintHandler, JsonEditorUIHintHandler>()
 0212            .AddScoped<IPropertyUIHandler, StaticCheckListOptionsProvider>()
 0213            .AddScoped<IPropertyUIHandler, StaticRadioListOptionsProvider>()
 0214            .AddScoped<IPropertyUIHandler, StaticDropDownOptionsProvider>()
 0215            .AddScoped<IPropertyUIHandler, JsonCodeOptionsProvider>()
 0216            .AddScoped<DictionaryValueEvaluator>()
 0217            .AddSingleton<IActivityDescriptorModifier, DictionaryUIHintInputModifier>()
 0218
 0219            // Logger state generators.
 0220            .AddSingleton(WorkflowLoggerStateGenerator)
 0221            .AddSingleton(ActivityLoggerStateGenerator)
 0222
 0223            // Log Persistence Strategies.
 0224            .AddScoped<ILogPersistenceStrategyService, DefaultLogPersistenceStrategyService>()
 0225            .AddScoped<ILogPersistenceStrategy, Include>()
 0226            .AddScoped<ILogPersistenceStrategy, Exclude>()
 0227            .AddScoped<ILogPersistenceStrategy, Inherit>()
 0228            .AddScoped<ILogPersistenceStrategy, Configuration>()
 0229
 0230            // Logging
 0231            .AddLogging();
 232
 233        // Overridable services
 0234        services.AddScoped<ICommitStateHandler, NoopCommitStateHandler>();
 0235    }
 236}