using System; using System.Data; using Elsa.Caching; using Elsa.DistributedLock; using Elsa.Extensions; using Elsa.Messages; using Elsa.Serialization; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Rebus.Config; using Rebus.DataBus.InMem; using Rebus.Logging; using Rebus.Persistence.InMem; using Rebus.Routing.TypeBased; using Rebus.ServiceProvider; using Rebus.Transport.InMem; using YesSql; using Storage.Net; using Storage.Net.Blobs; using YesSql.Provider.Sqlite; namespace Elsa { public class ElsaOptions { public ElsaOptions(IServiceCollection services) { Services = services; ConfigurePersistence = (sp, config) => config.UseSqLite("Data Source=elsa.db;Cache=Shared", IsolationLevel.ReadUncommitted); 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()); }; AddServiceBus = () => { services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddRebus(ConfigureInMemoryServiceBus); }; CreateJsonSerializer = sp => { var serializer = DefaultContentSerializer.CreateDefaultJsonSerializer(); JsonSerializerConfigurer(sp, serializer); return serializer; }; } public IServiceCollection Services { get; } internal Action ConfigurePersistence { get; set; } internal Func StorageFactory { 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 AddServiceBus { get; private set; } public ElsaOptions UseDistributedLockProvider(Func factory) { DistributedLockProviderFactory = factory; return this; } public ElsaOptions UseSignal(Func factory) { SignalFactory = factory; return this; } public ElsaOptions UsePersistence(Action configure) => UsePersistence((sp, config) => configure(config)); public ElsaOptions UsePersistence(Action configure) { ConfigurePersistence = configure; return this; } public ElsaOptions UseStorage(Func factory) => UseStorage(_ => factory()); public ElsaOptions UseStorage(Func factory) { StorageFactory = factory; return this; } public ElsaOptions UseAutoMapper(Action addAutoMapper) { AddAutoMapper = addAutoMapper; return this; } public ElsaOptions UseServiceBus(Action addServiceBus) { AddServiceBus = addServiceBus; return this; } public ElsaOptions UseJsonSerializer(Func factory) { CreateJsonSerializer = factory; return this; } public ElsaOptions ConfigureJsonSerializer(Action configure) { JsonSerializerConfigurer = configure; return this; } private static RebusConfigurer ConfigureInMemoryServiceBus(RebusConfigurer rebus, IServiceProvider serviceProvider) { var subscriberStore = serviceProvider.GetRequiredService(); var dataStore = serviceProvider.GetRequiredService(); var network = serviceProvider.GetRequiredService(); return rebus .Logging(logging => logging.ColoredConsole(LogLevel.Debug)) .Subscriptions(s => s.StoreInMemory(subscriberStore)) .DataBus(s => s.StoreInMemory(dataStore)) //.Routing(r => r.TypeBased().Map("runworkflow")) .Transport(t => t.UseInMemoryTransport(network, "elsa:publisher")); } } }