configure Redis cache and distributed locks
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
using Elsa.Caching;
|
||||
using Elsa.Caching.Features;
|
||||
using Elsa.EntityFrameworkCore.Modules.Management;
|
||||
using Elsa.Expressions.Contracts;
|
||||
using Elsa.Expressions.Services;
|
||||
using Elsa.Extensions;
|
||||
using Elsa.Features.Implementations;
|
||||
using Elsa.Workflows;
|
||||
using Elsa.Workflows.Serialization.Serializers;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using StackExchange.Redis;
|
||||
|
||||
namespace Elsa.Caching.UnitTests;
|
||||
|
||||
public static class CacheTestHost
|
||||
{
|
||||
public static ServiceProvider Create(string? databasePath = null, bool redis = false, string? prefix = null,
|
||||
Action<CacheFeature>? configure = null, Microsoft.EntityFrameworkCore.Diagnostics.DbCommandInterceptor? interceptor = null)
|
||||
{
|
||||
var services = new ServiceCollection();
|
||||
services.AddLogging();
|
||||
services.AddSingleton<IWellKnownTypeRegistry>(WellKnownTypeRegistry.CreateDefault());
|
||||
services.AddSingleton<IPayloadSerializer, JsonPayloadSerializer>();
|
||||
if (databasePath != null)
|
||||
services.AddDbContextFactory<ManagementElsaDbContext>(o =>
|
||||
{
|
||||
o.UseSqlite($"Data Source={databasePath}");
|
||||
if (interceptor != null) o.AddInterceptors(interceptor);
|
||||
});
|
||||
if (redis)
|
||||
services.AddSingleton<IConnectionMultiplexer>(_ => ConnectionMultiplexer.Connect(
|
||||
Environment.GetEnvironmentVariable("REDIS_TEST_CONNECTION") ?? "127.0.0.1:16379,abortConnect=false,connectTimeout=1000,syncTimeout=1000"));
|
||||
var module = new Module(services);
|
||||
module.UseCaching(cache =>
|
||||
{
|
||||
cache.RegisterRedis();
|
||||
if (databasePath != null)
|
||||
cache.ConsistencyStore = sp => ActivatorUtilities.CreateInstance<EFCoreCacheConsistencyStore>(sp);
|
||||
if (redis) cache.UseRedis(o => { o.Database = 1; o.KeyPrefix = prefix ?? "workflow-tests:" + Guid.NewGuid().ToString("N") + ":"; });
|
||||
configure?.Invoke(cache);
|
||||
});
|
||||
module.Apply();
|
||||
return services.BuildServiceProvider(new ServiceProviderOptions { ValidateScopes = true });
|
||||
}
|
||||
|
||||
public static async Task EnsureCreatedAsync(IServiceProvider services)
|
||||
{
|
||||
using var scope = services.CreateScope();
|
||||
await using var db = await scope.ServiceProvider.GetRequiredService<IDbContextFactory<ManagementElsaDbContext>>().CreateDbContextAsync();
|
||||
await db.Database.EnsureCreatedAsync();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user