using System; using Elsa.Caching; using Elsa.DistributedLock; using Elsa.Serialization; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Rebus.Config; using Rebus.DataBus.InMem; using Rebus.Persistence.InMem; using Rebus.Routing.TypeBased; using Rebus.Transport.InMem; using YesSql; using YesSql.Provider.Sqlite.InMemory; namespace Elsa { public class ElsaOptions { public ElsaOptions(IServiceCollection services) { Services = services; ConfigurePersistence = (sp, config) => config.UseInMemorySqlite(); DistributedLockProviderFactory = sp => new DefaultLockProvider(); SignalFactory = sp => new Signal(); ServiceBusConfigurer = ConfigureInMemoryServiceBus; JsonSerializerConfigurer = (sp, serializer) => {}; CreateJsonSerializer = sp => { var serializer = DefaultJsonSerializer.CreateDefaultJsonSerializer(); JsonSerializerConfigurer(sp, serializer); return serializer; }; } public IServiceCollection Services { get; } internal Action ConfigurePersistence { get; set; } internal Func DistributedLockProviderFactory { get; private set; } internal Func SignalFactory { get; private set; } internal Func ServiceBusConfigurer { get; private set; } internal Func CreateJsonSerializer { get; private set; } internal Action JsonSerializerConfigurer { 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 ConfigureServiceBus(Func configure) { ServiceBusConfigurer = configure; return this; } public ElsaOptions ConfigureServiceBus(Func configure) => ConfigureServiceBus((bus, _) => configure(bus)); 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) { return rebus .Logging(logging => logging.ColoredConsole()) .Subscriptions(s => s.StoreInMemory(new InMemorySubscriberStore())) .DataBus(s => s.StoreInMemory(new InMemDataStore())) .Routing(r => r.TypeBased()) .Transport(t => t.UseInMemoryTransport(new InMemNetwork(), "Messages")); } } }