using System; using Elsa.Caching; using Elsa.DistributedLock; using Microsoft.Extensions.DependencyInjection; using Rebus.Config; using Rebus.DataBus.InMem; using Rebus.Persistence.InMem; using Rebus.Routing.TypeBased; using Rebus.Transport.InMem; using YesSql; namespace Elsa { public class ElsaOptions { public ElsaOptions(IServiceCollection services) { Services = services; SessionFactory = sp => sp.GetRequiredService(); DistributedLockProviderFactory = sp => new DefaultLockProvider(); SignalFactory = sp => new Signal(); ServiceBusConfigurer = ConfigureInMemoryServiceBus; } public IServiceCollection Services { get; } internal Func SessionFactory { get; private set; } internal Func DistributedLockProviderFactory { get; private set; } internal Func SignalFactory { get; private set; } internal Func ServiceBusConfigurer { get; private set; } public ElsaOptions UseDistributedLockProvider(Func factory) { DistributedLockProviderFactory = factory; return this; } public ElsaOptions UseSignal(Func factory) { SignalFactory = factory; return this; } public ElsaOptions ConfigureServiceBus(Func configure) { ServiceBusConfigurer = configure; return this; } public ElsaOptions ConfigureServiceBus(Func configure) => ConfigureServiceBus((bus, _) => configure(bus)); 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")); } } }