using Foundatio.Caching; using Foundatio.Serializer; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using StackExchange.Redis; namespace PhoenixLib.DAL.Redis { public static class DependencyInjectionExtensions { public static IConnectionMultiplexer GetConnectionMultiplexer(this RedisConfiguration redisConfiguration) => ConnectionMultiplexer.Connect(new ConfigurationOptions { Password = redisConfiguration.Password, EndPoints = { $"{redisConfiguration.Host}:{redisConfiguration.Port}" } }); /// /// Register redis configuration from env /// /// public static void TryAddConfigurationFromEnv(this IServiceCollection services) { services.TryAddSingleton(s => RedisConfiguration.FromEnv()); } /// /// Registers the Connection Multiplexer /// /// internal static void TryAddConnectionMultiplexer(this IServiceCollection services) { services.TryAddSingleton(s => s.GetService().GetConnectionMultiplexer()); } /// /// Registers the Connection Multiplexer /// /// public static void TryAddConnectionMultiplexerFromEnv(this IServiceCollection services) { services.TryAddConfigurationFromEnv(); services.TryAddConnectionMultiplexer(); } public static void TryAddRedisCacheClient(this IServiceCollection services) { services.TryAddSingleton(s => new RedisCacheClient(new RedisCacheClientOptions { ConnectionMultiplexer = s.GetRequiredService(), Serializer = new JsonNetSerializer() })); services.TryAddSingleton(s => s.GetRequiredService()); } /// /// Registers a KeyValueStorage from Env /// /// /// /// public static void TryAddRedisKeyValueStorageFromEnv(this IServiceCollection services) { services.TryAddConnectionMultiplexerFromEnv(); services.TryAddRedisCacheClient(); services.TryAddSingleton(typeof(IKeyValueAsyncStorage<,>), typeof(RedisGenericKeyValueAsyncStorage<,>)); } } }