using System; using System.Linq; using System.Reflection; using AutoMapper; using Elsa.Caching; using Elsa.DistributedLock; using Elsa.Persistence; using Elsa.Persistence.InMemory; using Elsa.Serialization; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Rebus.DataBus.InMem; using Rebus.Logging; using Rebus.Persistence.InMem; using Rebus.Routing.TypeBased; using Rebus.Transport.InMem; using Storage.Net; using Storage.Net.Blobs; namespace Elsa { public class ElsaConfiguration { public ElsaConfiguration(IServiceCollection services) { Services = services; WorkflowDefinitionStoreFactory = sp => ActivatorUtilities.CreateInstance(sp); WorkflowInstanceStoreFactory = sp => ActivatorUtilities.CreateInstance(sp); WorkflowExecutionLogStoreFactory = sp => ActivatorUtilities.CreateInstance(sp); StorageFactory = sp => Storage.Net.StorageFactory.Blobs.InMemory(); DistributedLockProviderFactory = sp => new DefaultLockProvider(); SignalFactory = sp => new Signal(); JsonSerializerConfigurer = (sp, serializer) => { }; AddAutoMapper = () => { // The profiles are added to AddWorkflowsCore so that they are not forgotten in case the AddAutoMapper function(option) is overridden. services.AddAutoMapper(Enumerable.Empty(), serviceLifetime: ServiceLifetime.Singleton); }; services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); ConfigureServiceBusEndpoint = ConfigureInMemoryServiceBusEndpoint; CreateJsonSerializer = sp => { var serializer = DefaultContentSerializer.CreateDefaultJsonSerializer(); JsonSerializerConfigurer(sp, serializer); return serializer; }; } public IServiceCollection Services { get; } internal Func StorageFactory { get; set; } internal Func WorkflowDefinitionStoreFactory { get; set; } internal Func WorkflowInstanceStoreFactory { get; set; } internal Func WorkflowExecutionLogStoreFactory { get; set; } internal Func DistributedLockProviderFactory { get; private set; } internal Func SignalFactory { get; private set; } internal Func CreateJsonSerializer { get; private set; } internal Action JsonSerializerConfigurer { get; private set; } internal Action AddAutoMapper { get; private set; } internal Action ConfigureServiceBusEndpoint { get; private set; } public ElsaConfiguration UseDistributedLockProvider(Func factory) { DistributedLockProviderFactory = factory; return this; } public ElsaConfiguration UseSignal(Func factory) { SignalFactory = factory; return this; } public ElsaConfiguration UseStorage(Func factory) => UseStorage(_ => factory()); public ElsaConfiguration UseStorage(Func factory) { StorageFactory = factory; return this; } public ElsaConfiguration UseWorkflowDefinitionStore(Func factory) { WorkflowDefinitionStoreFactory = factory; return this; } public ElsaConfiguration UseWorkflowInstanceStore(Func factory) { WorkflowInstanceStoreFactory = factory; return this; } public ElsaConfiguration UseWorkflowExecutionLogStore(Func factory) { WorkflowExecutionLogStoreFactory = factory; return this; } public ElsaConfiguration UseAutoMapper(Action addAutoMapper) { AddAutoMapper = addAutoMapper; return this; } public ElsaConfiguration UseJsonSerializer(Func factory) { CreateJsonSerializer = factory; return this; } public ElsaConfiguration ConfigureJsonSerializer(Action configure) { JsonSerializerConfigurer = configure; return this; } public ElsaConfiguration UseServiceBus(Action setup) { ConfigureServiceBusEndpoint = setup; return this; } private static void ConfigureInMemoryServiceBusEndpoint(ServiceBusEndpointConfigurationContext context) { var serviceProvider = context.ServiceProvider; var transport = serviceProvider.GetService(); var store = serviceProvider.GetRequiredService(); var queueName = context.QueueName; context.Configurer .Logging(l => l.ColoredConsole(LogLevel.Info)) .Subscriptions(s => s.StoreInMemory(store)) .Transport(t => t.UseInMemoryTransport(transport, queueName)) .Routing(r => r.TypeBased().Map(context.MessageTypeMap)); } } }