using System; 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 ElsaOptions { public ElsaOptions(IServiceCollection services) { Services = services; WorkflowDefinitionStoreFactory = sp => ActivatorUtilities.CreateInstance(sp); WorkflowInstanceStoreFactory = sp => ActivatorUtilities.CreateInstance(sp); StorageFactory = sp => Storage.Net.StorageFactory.Blobs.InMemory(); DistributedLockProviderFactory = sp => new DefaultLockProvider(); SignalFactory = sp => new Signal(); JsonSerializerConfigurer = (sp, serializer) => { }; AddAutoMapper = () => { services.AddAutoMapper(ServiceLifetime.Singleton); services.AddSingleton(sp => sp.CreateAutoMapperConfiguration()); }; 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 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 ElsaOptions UseDistributedLockProvider(Func factory) { DistributedLockProviderFactory = factory; return this; } public ElsaOptions UseSignal(Func factory) { SignalFactory = factory; return this; } public ElsaOptions UseStorage(Func factory) => UseStorage(_ => factory()); public ElsaOptions UseStorage(Func factory) { StorageFactory = factory; return this; } public ElsaOptions UseWorkflowDefinitionStore(Func factory) { WorkflowDefinitionStoreFactory = factory; return this; } public ElsaOptions UseWorkflowInstanceStore(Func factory) { WorkflowInstanceStoreFactory = factory; return this; } public ElsaOptions UseAutoMapper(Action addAutoMapper) { AddAutoMapper = addAutoMapper; return this; } public ElsaOptions UseJsonSerializer(Func factory) { CreateJsonSerializer = factory; return this; } public ElsaOptions ConfigureJsonSerializer(Action configure) { JsonSerializerConfigurer = configure; return this; } public ElsaOptions 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)); } } }