using System; using System.Collections.Generic; using Elsa.Builders; using Elsa.Caching; using Elsa.Dispatch; using Elsa.Models; using Elsa.Persistence; using Elsa.Persistence.InMemory; using Elsa.Serialization; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using NodaTime; using Rebus.Persistence.InMem; using Rebus.Transport.InMem; using Storage.Net; using Storage.Net.Blobs; namespace Elsa { public class ElsaOptions { internal ElsaOptions() { WorkflowDefinitionStoreFactory = sp => ActivatorUtilities.CreateInstance(sp); WorkflowInstanceStoreFactory = sp => ActivatorUtilities.CreateInstance(sp); WorkflowExecutionLogStoreFactory = sp => ActivatorUtilities.CreateInstance(sp); WorkflowTriggerStoreFactory = sp => ActivatorUtilities.CreateInstance(sp); WorkflowDefinitionDispatcherFactory = sp => ActivatorUtilities.CreateInstance(sp); WorkflowInstanceDispatcherFactory = sp => ActivatorUtilities.CreateInstance(sp); CorrelatingWorkflowDispatcherFactory = sp => ActivatorUtilities.CreateInstance(sp); StorageFactory = sp => Storage.Net.StorageFactory.Blobs.InMemory(); SignalFactory = sp => new Signal(); JsonSerializerConfigurer = (sp, serializer) => { }; DistributedLockingOptions = new DistributedLockingOptions(); ConfigureServiceBusEndpoint = ConfigureInMemoryServiceBusEndpoint; CreateJsonSerializer = sp => { var serializer = DefaultContentSerializer.CreateDefaultJsonSerializer(); JsonSerializerConfigurer(sp, serializer); return serializer; }; } public ServiceFactory ActivityFactory { get; } = new(); public ServiceFactory WorkflowFactory { get; } = new(); public IEnumerable ActivityTypes => ActivityFactory.Types; public IList WorkflowTypes { get; } = new List(); public IList MessageTypes { get; } = new List(); public ServiceBusOptions ServiceBusOptions { get; } = new(); public DistributedLockingOptions DistributedLockingOptions { get; } /// /// The amount of time to wait before giving up on trying to acquire a lock. /// public Duration DistributedLockTimeout { get; set; } = Duration.FromHours(1); internal Func StorageFactory { get; set; } internal Func WorkflowDefinitionStoreFactory { get; set; } internal Func WorkflowInstanceStoreFactory { get; set; } internal Func WorkflowExecutionLogStoreFactory { get; set; } internal Func WorkflowTriggerStoreFactory { get; set; } internal Func SignalFactory { get; set; } internal Func CreateJsonSerializer { get; set; } internal Action JsonSerializerConfigurer { get; set; } internal Func WorkflowDefinitionDispatcherFactory { get; set; } internal Func WorkflowInstanceDispatcherFactory { get; set; } internal Func CorrelatingWorkflowDispatcherFactory { get; set; } internal Action ConfigureServiceBusEndpoint { get; set; } private static void ConfigureInMemoryServiceBusEndpoint(ServiceBusEndpointConfigurationContext context) { var serviceProvider = context.ServiceProvider; var transport = serviceProvider.GetService(); var store = serviceProvider.GetRequiredService(); var queueName = context.QueueName; context.Configurer .Subscriptions(s => s.StoreInMemory(store)) .Transport(t => t.UseInMemoryTransport(transport, queueName)); } } }