diff --git a/Elsa.sln b/Elsa.sln
index 426f37125..71c49b8a9 100644
--- a/Elsa.sln
+++ b/Elsa.sln
@@ -241,8 +241,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "locking", "locking", "{DBBD
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.DistributedLocking.SqlServer", "src\locking\Elsa.DistributedLocking.SqlServer\Elsa.DistributedLocking.SqlServer.csproj", "{B09A6E42-EF42-4693-BA0E-5EE1D7F81FFD}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.DistributedLocking.Redis", "src\locking\Elsa.DistributedLocking.Redis\Elsa.DistributedLocking.Redis.csproj", "{7E5514AC-3633-4237-9490-0992417F2273}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.DistributedLocking.AzureBlob", "src\locking\Elsa.DistributedLocking.AzureBlob\Elsa.DistributedLocking.AzureBlob.csproj", "{495BE954-E6EA-41A9-8054-A5CA5DD0924E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "blazor", "blazor", "{D86B94DC-A53C-4A67-A820-828DD359C49B}"
@@ -293,6 +291,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "caching", "caching", "{9937
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Caching.Rebus", "src\caching\Elsa.Caching.Rebus\Elsa.Caching.Rebus.csproj", "{61C16CA0-B190-4642-A81A-5C03705CA2C1}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "providers", "providers", "{EC5D4AFD-3F7F-4B51-9C38-F18C60618731}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Providers.Redis", "src\providers\Elsa.Providers.Redis\Elsa.Providers.Redis.csproj", "{9ACA06DA-9AFE-41A2-8109-EFED8B9B14A1}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -631,10 +633,6 @@ Global
{B09A6E42-EF42-4693-BA0E-5EE1D7F81FFD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B09A6E42-EF42-4693-BA0E-5EE1D7F81FFD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B09A6E42-EF42-4693-BA0E-5EE1D7F81FFD}.Release|Any CPU.Build.0 = Release|Any CPU
- {7E5514AC-3633-4237-9490-0992417F2273}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7E5514AC-3633-4237-9490-0992417F2273}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7E5514AC-3633-4237-9490-0992417F2273}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7E5514AC-3633-4237-9490-0992417F2273}.Release|Any CPU.Build.0 = Release|Any CPU
{495BE954-E6EA-41A9-8054-A5CA5DD0924E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{495BE954-E6EA-41A9-8054-A5CA5DD0924E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{495BE954-E6EA-41A9-8054-A5CA5DD0924E}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -687,6 +685,10 @@ Global
{61C16CA0-B190-4642-A81A-5C03705CA2C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{61C16CA0-B190-4642-A81A-5C03705CA2C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{61C16CA0-B190-4642-A81A-5C03705CA2C1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9ACA06DA-9AFE-41A2-8109-EFED8B9B14A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9ACA06DA-9AFE-41A2-8109-EFED8B9B14A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9ACA06DA-9AFE-41A2-8109-EFED8B9B14A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9ACA06DA-9AFE-41A2-8109-EFED8B9B14A1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -802,7 +804,6 @@ Global
{A80FC28D-D865-428D-AF12-7A393D407803} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180}
{DBBD242E-4437-4BDB-919F-A70839BE75FA} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925}
{B09A6E42-EF42-4693-BA0E-5EE1D7F81FFD} = {DBBD242E-4437-4BDB-919F-A70839BE75FA}
- {7E5514AC-3633-4237-9490-0992417F2273} = {DBBD242E-4437-4BDB-919F-A70839BE75FA}
{495BE954-E6EA-41A9-8054-A5CA5DD0924E} = {DBBD242E-4437-4BDB-919F-A70839BE75FA}
{D86B94DC-A53C-4A67-A820-828DD359C49B} = {4673732F-2853-47BD-91B8-C95C229D2C89}
{C869CC72-9A98-4246-9A76-6A50F48AFD85} = {4673732F-2853-47BD-91B8-C95C229D2C89}
@@ -820,6 +821,8 @@ Global
{3E2423CF-50E6-4D2B-8749-17B1EF540FE4} = {22E75696-6FE9-436A-9097-EE21C603F818}
{9937FB02-72D9-4FCD-B31E-8E60CFF1B37F} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925}
{61C16CA0-B190-4642-A81A-5C03705CA2C1} = {9937FB02-72D9-4FCD-B31E-8E60CFF1B37F}
+ {EC5D4AFD-3F7F-4B51-9C38-F18C60618731} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925}
+ {9ACA06DA-9AFE-41A2-8109-EFED8B9B14A1} = {EC5D4AFD-3F7F-4B51-9C38-F18C60618731}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158}
diff --git a/src/caching/Elsa.Caching.Rebus/Elsa.Caching.Rebus.csproj b/src/caching/Elsa.Caching.Rebus/Elsa.Caching.Rebus.csproj
index 578b8ffce..5b3f01a97 100644
--- a/src/caching/Elsa.Caching.Rebus/Elsa.Caching.Rebus.csproj
+++ b/src/caching/Elsa.Caching.Rebus/Elsa.Caching.Rebus.csproj
@@ -1,7 +1,15 @@
+
+
+
- net5.0
+ netstandard2.1
+
+ Elsa is a set of workflow libraries and tools that enable lean and mean workflowing capabilities in any .NET Core application.
+ This package contains a distributed cache signal decorator using Rebus to trigger signals.
+
+ elsa, workflows, rebus, cache
diff --git a/src/caching/Elsa.Caching.Rebus/Extensions/ServiceCollectionExtensions.cs b/src/caching/Elsa.Caching.Rebus/Extensions/ServiceCollectionExtensions.cs
index 78e5d1c48..edd899d0b 100644
--- a/src/caching/Elsa.Caching.Rebus/Extensions/ServiceCollectionExtensions.cs
+++ b/src/caching/Elsa.Caching.Rebus/Extensions/ServiceCollectionExtensions.cs
@@ -7,7 +7,7 @@ namespace Elsa.Caching.Rebus.Extensions
{
public static class ServiceCollectionExtensions
{
- public static ElsaOptionsBuilder AddRebusCacheSignal(this ElsaOptionsBuilder builder)
+ public static ElsaOptionsBuilder UseRebusCacheSignal(this ElsaOptionsBuilder builder)
{
var services = builder.Services;
services.Decorate();
diff --git a/src/caching/Elsa.Caching.Rebus/FodyWeavers.xml b/src/caching/Elsa.Caching.Rebus/FodyWeavers.xml
new file mode 100644
index 000000000..00e1d9a1c
--- /dev/null
+++ b/src/caching/Elsa.Caching.Rebus/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/caching/Elsa.Caching.Rebus/IsExternalInit.cs b/src/caching/Elsa.Caching.Rebus/IsExternalInit.cs
new file mode 100644
index 000000000..475dd51b6
--- /dev/null
+++ b/src/caching/Elsa.Caching.Rebus/IsExternalInit.cs
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.ComponentModel;
+
+// ReSharper disable once CheckNamespace
+namespace System.Runtime.CompilerServices
+{
+ ///
+ /// Reserved to be used by the compiler for tracking metadata.
+ /// This class should not be used by developers in source code.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ internal static class IsExternalInit
+ {
+ }
+}
\ No newline at end of file
diff --git a/src/locking/Elsa.DistributedLocking.Redis/Elsa.DistributedLocking.Redis.csproj b/src/locking/Elsa.DistributedLocking.Redis/Elsa.DistributedLocking.Redis.csproj
deleted file mode 100644
index b38b33455..000000000
--- a/src/locking/Elsa.DistributedLocking.Redis/Elsa.DistributedLocking.Redis.csproj
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
- netstandard2.1
- Elsa
-
- Elsa is a set of workflow libraries and tools that enable lean and mean workflowing capabilities in any .NET Core application.
- This package provides a distributed locking provider using Redis.
-
- elsa, workflows, distributed lock, redis
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/locking/Elsa.DistributedLocking.Redis/FodyWeavers.xml b/src/locking/Elsa.DistributedLocking.Redis/FodyWeavers.xml
deleted file mode 100644
index 4c4041f8a..000000000
--- a/src/locking/Elsa.DistributedLocking.Redis/FodyWeavers.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/src/providers/Elsa.Providers.Redis/Elsa.Providers.Redis.csproj b/src/providers/Elsa.Providers.Redis/Elsa.Providers.Redis.csproj
new file mode 100644
index 000000000..60dd8d362
--- /dev/null
+++ b/src/providers/Elsa.Providers.Redis/Elsa.Providers.Redis.csproj
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ netstandard2.1
+ Elsa
+
+ Elsa is a set of workflow libraries and tools that enable lean and mean workflowing capabilities in any .NET Core application.
+ This package provides a Redis implementation of a distributed lock provider and distributed cache signaler.
+
+ elsa, workflows, distributed lock, cache, redis
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/providers/Elsa.Providers.Redis/Extensions/RedisCacheSignalElsaOptionsBuilderExtensions.cs b/src/providers/Elsa.Providers.Redis/Extensions/RedisCacheSignalElsaOptionsBuilderExtensions.cs
new file mode 100644
index 000000000..fa5daa8d1
--- /dev/null
+++ b/src/providers/Elsa.Providers.Redis/Extensions/RedisCacheSignalElsaOptionsBuilderExtensions.cs
@@ -0,0 +1,23 @@
+using Elsa.Caching;
+using Elsa.Runtime;
+using Elsa.Services;
+using Elsa.StartupTasks;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Elsa.Extensions
+{
+ public static class RedisCacheSignalElsaOptionsBuilderExtensions
+ {
+ public static ElsaOptionsBuilder UseRedisCacheSignal(this ElsaOptionsBuilder builder)
+ {
+ var services = builder.Services;
+
+ services
+ .AddSingleton()
+ .AddStartupTask()
+ .Decorate();
+
+ return builder;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/locking/Elsa.DistributedLocking.Redis/DistributedLockingOptionsExtensions.cs b/src/providers/Elsa.Providers.Redis/Extensions/RedisDistributedLockingOptionsExtensions.cs
similarity index 62%
rename from src/locking/Elsa.DistributedLocking.Redis/DistributedLockingOptionsExtensions.cs
rename to src/providers/Elsa.Providers.Redis/Extensions/RedisDistributedLockingOptionsExtensions.cs
index c3293a9d8..39d67d97c 100644
--- a/src/locking/Elsa.DistributedLocking.Redis/DistributedLockingOptionsExtensions.cs
+++ b/src/providers/Elsa.Providers.Redis/Extensions/RedisDistributedLockingOptionsExtensions.cs
@@ -7,17 +7,13 @@ using RedLockNet.SERedis;
using RedLockNet.SERedis.Configuration;
using StackExchange.Redis;
-namespace Elsa
+namespace Elsa.Extensions
{
- public static class DistributedLockingOptionsExtensions
+ public static class RedisDistributedLockingOptionsExtensions
{
- public static DistributedLockingOptionsBuilder UseRedisLockProvider(this DistributedLockingOptionsBuilder options, string connectionString)
+ public static DistributedLockingOptionsBuilder UseRedisLockProvider(this DistributedLockingOptionsBuilder options)
{
- options
- .Services
- .UseStackExchangeConnectionMultiplexer(connectionString)
- .UseRedLockFactory();
-
+ options.Services.AddRedLockFactory();
options.UseProviderFactory(CreateRedisDistributedLockFactory);
return options;
@@ -29,9 +25,7 @@ namespace Elsa
return name => new RedisDistributedLock(name, multiplexer.GetDatabase());
}
- private static IServiceCollection UseStackExchangeConnectionMultiplexer(this IServiceCollection services, string connectionString) => services.AddSingleton(ConnectionMultiplexer.Connect(connectionString));
-
- private static IServiceCollection UseRedLockFactory(this IServiceCollection services) =>
+ private static IServiceCollection AddRedLockFactory(this IServiceCollection services) =>
services.AddSingleton(sp => RedLockFactory.Create(
new[]
{
diff --git a/src/providers/Elsa.Providers.Redis/Extensions/RedisServiceCollectionExtensions.cs b/src/providers/Elsa.Providers.Redis/Extensions/RedisServiceCollectionExtensions.cs
new file mode 100644
index 000000000..945380c73
--- /dev/null
+++ b/src/providers/Elsa.Providers.Redis/Extensions/RedisServiceCollectionExtensions.cs
@@ -0,0 +1,13 @@
+using Microsoft.Extensions.DependencyInjection;
+using StackExchange.Redis;
+
+namespace Elsa.Extensions
+{
+ public static class RedisServiceCollectionExtensions
+ {
+ public static IServiceCollection AddRedis(this IServiceCollection services, string connectionString)
+ {
+ return services.AddSingleton(ConnectionMultiplexer.Connect(connectionString));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/providers/Elsa.Providers.Redis/FodyWeavers.xml b/src/providers/Elsa.Providers.Redis/FodyWeavers.xml
new file mode 100644
index 000000000..00e1d9a1c
--- /dev/null
+++ b/src/providers/Elsa.Providers.Redis/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/providers/Elsa.Providers.Redis/IsExternalInit.cs b/src/providers/Elsa.Providers.Redis/IsExternalInit.cs
new file mode 100644
index 000000000..475dd51b6
--- /dev/null
+++ b/src/providers/Elsa.Providers.Redis/IsExternalInit.cs
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.ComponentModel;
+
+// ReSharper disable once CheckNamespace
+namespace System.Runtime.CompilerServices
+{
+ ///
+ /// Reserved to be used by the compiler for tracking metadata.
+ /// This class should not be used by developers in source code.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ internal static class IsExternalInit
+ {
+ }
+}
\ No newline at end of file
diff --git a/src/providers/Elsa.Providers.Redis/Services/RebusCacheSignal.cs b/src/providers/Elsa.Providers.Redis/Services/RebusCacheSignal.cs
new file mode 100644
index 000000000..13bdaefd7
--- /dev/null
+++ b/src/providers/Elsa.Providers.Redis/Services/RebusCacheSignal.cs
@@ -0,0 +1,27 @@
+using System.Threading.Tasks;
+using Elsa.Caching;
+using Microsoft.Extensions.Primitives;
+
+namespace Elsa.Services
+{
+ public class RedisCacheSignal : ICacheSignal
+ {
+ private readonly ICacheSignal _cacheSignal;
+ private readonly RedisBus _redisBus;
+
+ public RedisCacheSignal(ICacheSignal cacheSignal, RedisBus redisBus)
+ {
+ _cacheSignal = cacheSignal;
+ _redisBus = redisBus;
+ }
+
+ public IChangeToken GetToken(string key) => _cacheSignal.GetToken(key);
+ public void TriggerToken(string key) => _cacheSignal.TriggerToken(key);
+
+ public async ValueTask TriggerTokenAsync(string key)
+ {
+ await _cacheSignal.TriggerTokenAsync(key);
+ await _redisBus.PublishAsync(nameof(CacheSignal), key);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/providers/Elsa.Providers.Redis/Services/RedisBus.cs b/src/providers/Elsa.Providers.Redis/Services/RedisBus.cs
new file mode 100644
index 000000000..d32fe9827
--- /dev/null
+++ b/src/providers/Elsa.Providers.Redis/Services/RedisBus.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Diagnostics;
+using System.Linq;
+using System.Net;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
+using StackExchange.Redis;
+
+namespace Elsa.Services
+{
+ public class RedisBus
+ {
+ ///
+ /// TODO: Design multi-tenancy.
+ ///
+ private const string? TenantId = default;
+
+ private readonly string _hostName;
+ private readonly string _channelPrefix;
+ private readonly string _messagePrefix;
+ private readonly IConnectionMultiplexer _multiplexer;
+ private readonly ILogger _logger;
+
+ public RedisBus(IConnectionMultiplexer multiplexer, IContainerNameAccessor containerNameAccessor, ILogger logger)
+ {
+ _multiplexer = multiplexer;
+ _hostName = Dns.GetHostName() + ':' + Process.GetCurrentProcess().Id;
+ _channelPrefix = (TenantId ?? "Default") + ':';
+ _messagePrefix = _hostName + '/';
+ _logger = logger;
+ }
+
+ public async Task SubscribeAsync(string channel, Action handler)
+ {
+ try
+ {
+ var subscriber = _multiplexer.GetSubscriber();
+
+ await subscriber.SubscribeAsync(_channelPrefix + channel, (redisChannel, redisValue) =>
+ {
+ var tokens = redisValue.ToString().Split('/').ToArray();
+
+ if (tokens.Length != 2 || tokens[0].Length == 0 || tokens[0].Equals(_hostName, StringComparison.OrdinalIgnoreCase))
+ return;
+
+ handler(channel, tokens[1]);
+ });
+ }
+ catch (Exception e)
+ {
+ _logger.LogError(e, "Unable to subscribe to channel {ChannelName}", _channelPrefix + channel);
+ }
+ }
+
+ public async Task PublishAsync(string channel, string message)
+ {
+ try
+ {
+ await _multiplexer.GetSubscriber().PublishAsync(_channelPrefix + channel, _messagePrefix + message);
+ }
+ catch (Exception e)
+ {
+ _logger.LogError(e, "Unable to publish to channel {ChannelName}", _channelPrefix + channel);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/providers/Elsa.Providers.Redis/StartupTasks/SubscribeToRedisCacheSignals.cs b/src/providers/Elsa.Providers.Redis/StartupTasks/SubscribeToRedisCacheSignals.cs
new file mode 100644
index 000000000..febf71f0c
--- /dev/null
+++ b/src/providers/Elsa.Providers.Redis/StartupTasks/SubscribeToRedisCacheSignals.cs
@@ -0,0 +1,22 @@
+using System.Threading;
+using System.Threading.Tasks;
+using Elsa.Caching;
+using Elsa.Services;
+
+namespace Elsa.StartupTasks
+{
+ public class SubscribeToRedisCacheSignals : IStartupTask
+ {
+ private readonly RedisBus _redisBus;
+ private readonly ICacheSignal _cacheSignal;
+
+ public SubscribeToRedisCacheSignals(RedisBus redisBus, ICacheSignal cacheSignal)
+ {
+ _redisBus = redisBus;
+ _cacheSignal = cacheSignal;
+ }
+
+ public int Order => 0;
+ public async Task ExecuteAsync(CancellationToken cancellationToken = default) => await _redisBus.SubscribeAsync(nameof(CacheSignal), (channel, message) => _cacheSignal.TriggerToken(message));
+ }
+}
\ No newline at end of file
diff --git a/src/samples/server/Elsa.Samples.Server.Host/Elsa.Samples.Server.Host.csproj b/src/samples/server/Elsa.Samples.Server.Host/Elsa.Samples.Server.Host.csproj
index 51e2e0734..40f944a55 100644
--- a/src/samples/server/Elsa.Samples.Server.Host/Elsa.Samples.Server.Host.csproj
+++ b/src/samples/server/Elsa.Samples.Server.Host/Elsa.Samples.Server.Host.csproj
@@ -18,6 +18,7 @@
+
diff --git a/src/samples/server/Elsa.Samples.Server.Host/Startup.cs b/src/samples/server/Elsa.Samples.Server.Host/Startup.cs
index 6cd667a78..d43751993 100644
--- a/src/samples/server/Elsa.Samples.Server.Host/Startup.cs
+++ b/src/samples/server/Elsa.Samples.Server.Host/Startup.cs
@@ -1,6 +1,7 @@
using System;
using Elsa.Activities.UserTask.Extensions;
using Elsa.Caching.Rebus.Extensions;
+using Elsa.Extensions;
using Elsa.Persistence.EntityFramework.Core.Extensions;
using Elsa.Persistence.EntityFramework.PostgreSql;
using Elsa.Persistence.EntityFramework.Sqlite;
@@ -37,11 +38,13 @@ namespace Elsa.Samples.Server.Host
services
.AddActivityPropertyOptionsProvider()
.AddRuntimeSelectItemsProvider()
+ .AddRedis(Configuration.GetConnectionString("Redis"))
.AddElsa(elsa => elsa
- .WithContainerName(Configuration["ContainerName"] ?? System.Environment.MachineName)
+ //.WithContainerName(Configuration["ContainerName"] ?? System.Environment.MachineName)
.UseEntityFrameworkPersistence(ef => ef.UseSqlite())
- .UseRabbitMq(Configuration.GetConnectionString("RabbitMq"))
- .AddRebusCacheSignal()
+ //.UseRabbitMq(Configuration.GetConnectionString("RabbitMq"))
+ //.UseRebusCacheSignal()
+ //.UseRedisCacheSignal()
.AddConsoleActivities()
.AddHttpActivities(elsaSection.GetSection("Http").Bind)
.AddEmailActivities(elsaSection.GetSection("Smtp").Bind)
diff --git a/src/samples/server/Elsa.Samples.Server.Host/appsettings.json b/src/samples/server/Elsa.Samples.Server.Host/appsettings.json
index 6e20eb179..8c151f1bd 100644
--- a/src/samples/server/Elsa.Samples.Server.Host/appsettings.json
+++ b/src/samples/server/Elsa.Samples.Server.Host/appsettings.json
@@ -9,7 +9,8 @@
},
"AllowedHosts": "*",
"ConnectionStrings": {
- "RabbitMq": "amqp://localhost:5672"
+ "RabbitMq": "amqp://localhost:5672",
+ "Redis": "localhost:6379,abortConnect=false"
},
"Elsa": {
"Http": {
diff --git a/src/samples/worker/Elsa.Samples.DistributedLock/Elsa.Samples.DistributedLock.csproj b/src/samples/worker/Elsa.Samples.DistributedLock/Elsa.Samples.DistributedLock.csproj
index adba6962e..b82b002cd 100644
--- a/src/samples/worker/Elsa.Samples.DistributedLock/Elsa.Samples.DistributedLock.csproj
+++ b/src/samples/worker/Elsa.Samples.DistributedLock/Elsa.Samples.DistributedLock.csproj
@@ -16,13 +16,10 @@
-
-
-
-
+
diff --git a/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs b/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs
index 979668cc6..55291ef98 100644
--- a/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs
+++ b/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs
@@ -1,6 +1,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
+using Elsa.Extensions;
namespace Elsa.Samples.DistributedLock
{
@@ -18,7 +19,8 @@ namespace Elsa.Samples.DistributedLock
(_, services) =>
{
services
- .AddElsa(elsa => elsa.ConfigureDistributedLockProvider(options => options.UseRedisLockProvider("localhost:6379,abortConnect=false"))
+ .AddRedis("localhost:6379,abortConnect=false")
+ .AddElsa(elsa => elsa.ConfigureDistributedLockProvider(options => options.UseRedisLockProvider())
.AddConsoleActivities()
.AddQuartzTemporalActivities()
.AddWorkflow());
diff --git a/src/servicebus/Elsa.Rebus.RabbitMq/Extensions/ElsaOptionsExtensions.cs b/src/servicebus/Elsa.Rebus.RabbitMq/Extensions/ElsaOptionsBuilderExtensions.cs
similarity index 90%
rename from src/servicebus/Elsa.Rebus.RabbitMq/Extensions/ElsaOptionsExtensions.cs
rename to src/servicebus/Elsa.Rebus.RabbitMq/Extensions/ElsaOptionsBuilderExtensions.cs
index 4c4a98ff7..c611876b3 100644
--- a/src/servicebus/Elsa.Rebus.RabbitMq/Extensions/ElsaOptionsExtensions.cs
+++ b/src/servicebus/Elsa.Rebus.RabbitMq/Extensions/ElsaOptionsBuilderExtensions.cs
@@ -3,7 +3,7 @@ using Rebus.Config;
namespace Elsa.Rebus.RabbitMq.Extensions
{
- public static class ElsaOptionsExtensions
+ public static class ElsaOptionsBuilderExtensions
{
public static ElsaOptionsBuilder UseRabbitMq(this ElsaOptionsBuilder elsaOptions, string connectionString) => elsaOptions.UseServiceBus(context => ConfigureRabbitMqEndpoint(context, connectionString));
private static void ConfigureRabbitMqEndpoint(ServiceBusEndpointConfigurationContext context, string connectionString) => context.Configurer.Transport(t => t.UseRabbitMq(connectionString, context.QueueName));