Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 3
0
        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);
        }