/// <summary> /// Adds services which are common to temporal activities. This method is intended for internal use only. /// </summary> /// <remarks> /// <para> /// Instead of calling this method directly, when setting up Elsa for temporal (time-based) activities, /// developers should make use of one of the implementation-specific add-temporal-activities methods. /// Without providing an implementation-specific configuration in <paramref name="configure"/>, this method /// will not fully set up the temporal activities. /// </para> /// </remarks> /// <param name="options">Elsa options</param> /// <param name="configure">The configuration for temporal activity options</param> public static ElsaOptionsBuilder AddCommonTemporalActivities(this ElsaOptionsBuilder options, Action <TimersOptions>?configure = default) { var timersOptions = new TimersOptions(options.Services); configure?.Invoke(timersOptions); options.Services .AddNotificationHandlers(typeof(UnscheduleTimers)) .AddHostedService <ScopedBackgroundService <StartJobs> >() .AddBookmarkProvider <TimerBookmarkProvider>() .AddBookmarkProvider <CronBookmarkProvider>() .AddBookmarkProvider <StartAtBookmarkProvider>(); options .AddActivity <Cron>() .AddActivity <Timer>() .AddActivity <StartAt>() .AddActivity <ClearTimer>(); // Register a consumer to process instructions to schedule activities from bookmarks. options.AddCompetingConsumer <ScheduleBookmarkConsumer, ScheduleTemporalBookmark>("ScheduleBookmark"); options.AddCompetingConsumer <ScheduleTriggerConsumer, ScheduleTemporalTrigger>("ScheduleBookmark"); return(options); }
public static ElsaOptionsBuilder AddAzureServiceBusActivities(this ElsaOptionsBuilder options, Action <AzureServiceBusOptions>?configure) { if (configure != null) { options.Services.Configure(configure); } else { options.Services.AddOptions <AzureServiceBusOptions>(); } options.Services .AddSingleton(CreateServiceBusConnection) .AddSingleton(CreateServiceBusManagementClient) .AddSingleton <BusClientFactory>() .AddSingleton <IQueueMessageSenderFactory>(sp => sp.GetRequiredService <BusClientFactory>()) .AddSingleton <IQueueMessageReceiverClientFactory>(sp => sp.GetRequiredService <BusClientFactory>()) .AddSingleton <ITopicMessageSenderFactory>(sp => sp.GetRequiredService <BusClientFactory>()) .AddSingleton <ITopicMessageReceiverFactory>(sp => sp.GetRequiredService <BusClientFactory>()) .AddSingleton <IServiceBusQueuesStarter, ServiceBusQueuesStarter>() .AddSingleton <IServiceBusTopicsStarter, ServiceBusTopicsStarter>() .AddSingleton <Scoped <IWorkflowLaunchpad> >() .AddStartupTask <StartServiceBusQueues>() .AddStartupTask <StartServiceBusTopics>() .AddBookmarkProvider <QueueMessageReceivedBookmarkProvider>() .AddBookmarkProvider <TopicMessageReceivedBookmarkProvider>() ; options.AddCompetingConsumer <RestartServiceBusQueuesConsumer, WorkflowDefinitionPublished>(); options.AddCompetingConsumer <RestartServiceBusQueuesConsumer, WorkflowDefinitionRetracted>(); options.AddCompetingConsumer <RestartServiceBusTopicsConsumer, WorkflowDefinitionPublished>(); options.AddCompetingConsumer <RestartServiceBusTopicsConsumer, WorkflowDefinitionRetracted>(); options .AddActivity <AzureServiceBusQueueMessageReceived>() .AddActivity <SendAzureServiceBusQueueMessage>() .AddActivity <SendAzureServiceBusTopicMessage>() .AddActivity <AzureServiceBusTopicMessageReceived>() ; return(options); }
private static ElsaOptionsBuilder AddWorkflowsCore(this ElsaOptionsBuilder elsaOptions) { var services = elsaOptions.Services; services .TryAddSingleton <IClock>(SystemClock.Instance); services .AddLogging() .AddLocalization() .AddSingleton <IContainerNameAccessor, OptionsContainerNameAccessor>() .AddSingleton <IIdGenerator, IdGenerator>() .AddScoped <IWorkflowRegistry, WorkflowRegistry>() .AddSingleton <IActivityActivator, ActivityActivator>() .AddSingleton <ITokenService, TokenService>() .AddScoped <IWorkflowRunner, WorkflowRunner>() .AddScoped <WorkflowStarter>() .AddScoped <WorkflowResumer>() .AddScoped <IStartsWorkflow>(sp => sp.GetRequiredService <WorkflowStarter>()) .AddScoped <IStartsWorkflows>(sp => sp.GetRequiredService <WorkflowStarter>()) .AddScoped <IFindsAndStartsWorkflows>(sp => sp.GetRequiredService <WorkflowStarter>()) .AddScoped <IBuildsAndStartsWorkflow>(sp => sp.GetRequiredService <WorkflowStarter>()) .AddScoped <IFindsAndResumesWorkflows>(sp => sp.GetRequiredService <WorkflowResumer>()) .AddScoped <IResumesWorkflow>(sp => sp.GetRequiredService <WorkflowResumer>()) .AddScoped <IResumesWorkflows>(sp => sp.GetRequiredService <WorkflowResumer>()) .AddScoped <IBuildsAndResumesWorkflow>(sp => sp.GetRequiredService <WorkflowResumer>()) .AddScoped <IWorkflowLaunchpad, WorkflowLaunchpad>() .AddScoped <IWorkflowInstanceExecutor, WorkflowInstanceExecutor>() .AddScoped <IWorkflowTriggerInterruptor, WorkflowTriggerInterruptor>() .AddScoped <IWorkflowReviver, WorkflowReviver>() .AddScoped <IWorkflowInstanceCanceller, WorkflowInstanceCanceller>() .AddScoped <IWorkflowInstanceDeleter, WorkflowInstanceDeleter>() .AddSingleton <IWorkflowFactory, WorkflowFactory>() .AddTransient <IWorkflowBlueprintMaterializer, WorkflowBlueprintMaterializer>() .AddSingleton <IWorkflowBlueprintReflector, WorkflowBlueprintReflector>() .AddSingleton <IBackgroundWorker, BackgroundWorker>() .AddSingleton <ICompensationService, CompensationService>() .AddScoped <IWorkflowPublisher, WorkflowPublisher>() .AddScoped <IWorkflowContextManager, WorkflowContextManager>() .AddScoped <IActivityTypeService, ActivityTypeService>() .AddActivityTypeProvider <TypeBasedActivityProvider>() .AddTransient <ICreatesWorkflowExecutionContextForWorkflowBlueprint, WorkflowExecutionContextForWorkflowBlueprintFactory>() .AddTransient <ICreatesActivityExecutionContextForActivityBlueprint, ActivityExecutionContextForActivityBlueprintFactory>() .AddTransient <IGetsStartActivities, GetsStartActivitiesProvider>() ; // Data Protection. services.AddDataProtection(); // Serialization. services .AddTransient <Func <JsonSerializer> >(sp => sp.GetRequiredService <JsonSerializer>) .AddTransient(sp => sp.GetRequiredService <ElsaOptions>().CreateJsonSerializer(sp)) .AddSingleton <IContentSerializer, DefaultContentSerializer>() .AddSingleton <TypeJsonConverter>(); // Expressions. services .TryAddProvider <IExpressionHandler, LiteralHandler>(ServiceLifetime.Singleton) .TryAddProvider <IExpressionHandler, VariableHandler>(ServiceLifetime.Singleton) .TryAddProvider <IExpressionHandler, JsonHandler>(ServiceLifetime.Singleton) .TryAddProvider <IExpressionHandler, SwitchHandler>(ServiceLifetime.Singleton) .AddScoped <IExpressionEvaluator, ExpressionEvaluator>(); // Workflow providers. services .AddWorkflowProvider <ProgrammaticWorkflowProvider>() .AddWorkflowProvider <BlobStorageWorkflowProvider>() .AddWorkflowProvider <DatabaseWorkflowProvider>(); services.Configure <BlobStorageWorkflowProviderOptions>(o => o.BlobStorageFactory = StorageFactory.Blobs.InMemory); // Workflow Storage Providers. services .AddSingleton <IWorkflowStorageService, WorkflowStorageService>() .AddWorkflowStorageProvider <TransientWorkflowStorageProvider>() .AddWorkflowStorageProvider <WorkflowInstanceWorkflowStorageProvider>() .AddWorkflowStorageProvider <BlobStorageWorkflowStorageProvider>(); services.Configure <BlobStorageWorkflowStorageProviderOptions>(o => o.BlobStorageFactory = StorageFactory.Blobs.InMemory); // Metadata. services .AddSingleton <IDescribesActivityType, TypedActivityTypeDescriber>() .AddSingleton <IActivityPropertyOptionsResolver, ActivityPropertyOptionsResolver>() .AddSingleton <IActivityPropertyDefaultValueResolver, ActivityPropertyDefaultValueResolver>() .AddSingleton <IActivityPropertyUIHintResolver, ActivityPropertyUIHintResolver>(); // Bookmarks. services .AddSingleton <IBookmarkHasher, BookmarkHasher>() .AddSingleton <IBookmarkSerializer, BookmarkSerializer>() .AddScoped <IBookmarkIndexer, BookmarkIndexer>() .AddScoped <IBookmarkFinder, BookmarkFinder>() .AddScoped <ITriggerIndexer, TriggerIndexer>() .AddScoped <IGetsTriggersForWorkflowBlueprints, TriggersForBlueprintsProvider>() .AddTransient <IGetsTriggersForActivityBlueprintAndWorkflow, TriggersForActivityBlueprintAndWorkflowProvider>() .AddScoped <ITriggerFinder, TriggerFinder>() .AddScoped <ITriggerRemover, TriggerRemover>() .AddBookmarkProvider <SignalReceivedBookmarkProvider>() .AddBookmarkProvider <RunWorkflowBookmarkProvider>(); // Mediator. services .AddMediatR(mediatr => mediatr.AsScoped(), typeof(IActivity), typeof(LogWorkflowExecution)); // Service Bus. services .AddSingleton <ServiceBusFactory>() .AddSingleton <IServiceBusFactory>(sp => sp.GetRequiredService <ServiceBusFactory>()) .AddSingleton <ICommandSender, CommandSender>() .AddSingleton <IEventPublisher, EventPublisher>(); elsaOptions .AddCompetingConsumer <TriggerWorkflowsRequestConsumer, TriggerWorkflowsRequest>("ExecuteWorkflow") .AddCompetingConsumer <ExecuteWorkflowDefinitionRequestConsumer, ExecuteWorkflowDefinitionRequest>("ExecuteWorkflow") .AddCompetingConsumer <ExecuteWorkflowInstanceRequestConsumer, ExecuteWorkflowInstanceRequest>("ExecuteWorkflow"); // AutoMapper. services .AddAutoMapperProfile <NodaTimeProfile>() .AddAutoMapperProfile <CloningProfile>() .AddAutoMapperProfile <ExceptionProfile>() .AddTransient <ExceptionConverter>() .AddSingleton <ICloner, AutoMapperCloner>(); // Caching. services .AddMemoryCache() .AddScoped <ISignaler, Signaler>() .Decorate <IWorkflowRegistry, CachingWorkflowRegistry>(); // Builder API. services .AddTransient <IWorkflowBuilder, WorkflowBuilder>() .AddTransient <ICompositeActivityBuilder, CompositeActivityBuilder>() .AddTransient <Func <IWorkflowBuilder> >(sp => sp.GetRequiredService <IWorkflowBuilder>); return(elsaOptions); }