RedisServiceFactory
El servicio RedisServiceFactory
proporciona una fábrica para crear y gestionar instancias de IRedis
. Su propósito principal es abstraer la creación de los servicios Redis, permitiendo que la aplicación pueda solicitar instancias específicas de IRedis
basadas en nombres configurados, facilitando el uso de múltiples conexiones a Redis en la misma aplicación.
namespace CodeDesignPlus.Net.Redis.Abstractions;
/// <summary>/// Defines a factory for creating and initializing instances of <see cref="IRedis"/> based on a provided instance name./// </summary>public interface IRedisFactory{ /// <summary> /// Creates and initializes an instance of <see cref="IRedis"/> based on the provided instance name. /// </summary> /// <param name="name">The name of the Redis instance to create.</param> /// <returns>An initialized <see cref="IRedis"/> instance.</returns> /// <exception cref="ArgumentNullException">Thrown when the name is null or empty.</exception> IRedis Create(string name);}
¿Cómo Funciona?
RedisServiceFactory
funciona como un punto central para la creación de servicios Redis (IRedis
). La fábrica toma un nombre como entrada, busca la configuración correspondiente en las opciones de Redis (configuradas a través de RedisOptions
), y crea una instancia de IRedis
con esa configuración. Esto permite gestionar múltiples conexiones a Redis con diferentes configuraciones, todo gestionado centralmente por la fábrica. La creación de cada instancia es controlada por la fábrica, asegurando que los servicios Redis sean inicializados correctamente antes de ser utilizados por la aplicación.
Métodos
RedisServiceFactory
proporciona un único método para crear instancias de IRedis
basadas en un nombre específico.
Create
Type: public IRedis Create(string name)
Este método es responsable de crear y devolver una instancia de IRedis
. Toma como parámetro el nombre de la instancia de Redis que se desea crear. El método realiza los siguientes pasos:
- Validación del nombre: Verifica que el nombre proporcionado no sea nulo o vacío.
- Obtención de la configuración: Busca en las opciones de Redis la configuración de instancia con el nombre proporcionado.
- Creación de
RedisService
: Crea una instancia deRedisService
, que es la implementación concreta deIRedis
. - Inicialización de la instancia: Llama al método
Initialize
deRedisService
con la configuración de la instancia. - Retorno de la instancia: Retorna la instancia creada y configurada de
IRedis
.
Implementación
La implementación de RedisServiceFactory
se encarga de la lógica de creación e inicialización de las instancias de IRedis
. Internamente, utiliza las opciones de configuración registradas en el contenedor de inyección de dependencias (IOptions<RedisOptions>
) para recuperar la configuración de la instancia Redis requerida. El método Create
busca la configuración por nombre y crea una instancia del RedisService
correspondiente, pasando la configuración de instancia que corresponda.
namespace CodeDesignPlus.Net.Redis.Services;
/// <summary>/// Factory for creating and managing Redis services./// </summary>public class RedisServiceFactory : IRedisFactory{ private readonly IServiceProvider serviceProvider; private readonly RedisOptions options; private readonly ILogger<RedisServiceFactory> logger; private readonly ConcurrentDictionary<string, Abstractions.IRedis> instances = new();
/// <summary> /// Initializes a new instance of the <see cref="RedisServiceFactory"/> class. /// </summary> /// <param name="serviceProvider">The service provider.</param> /// <param name="options">The Redis options.</param> /// <param name="logger">The logger instance.</param> /// <exception cref="ArgumentNullException">Thrown when <paramref name="serviceProvider"/>, <paramref name="options"/>, or <paramref name="logger"/> is null.</exception> public RedisServiceFactory(IServiceProvider serviceProvider, IOptions<RedisOptions> options, ILogger<RedisServiceFactory> logger) { ArgumentNullException.ThrowIfNull(serviceProvider); ArgumentNullException.ThrowIfNull(options); ArgumentNullException.ThrowIfNull(logger);
this.serviceProvider = serviceProvider; this.options = options.Value; this.logger = logger;
this.logger.LogInformation("RedisServiceFactory has been initialized"); }
/// <summary> /// Creates a Redis service for the specified instance name. /// </summary> /// <param name="name">The name of the Redis instance.</param> /// <returns>The Redis service.</returns> /// <exception cref="ArgumentNullException">Thrown when <paramref name="name"/> is null or empty.</exception> /// <exception cref="Exceptions.RedisException">Thrown when the Redis instance with the specified name is not registered.</exception> public Abstractions.IRedis Create(string name) { if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
if (!options.Instances.TryGetValue(name, out Instance value)) throw new Exceptions.RedisException($"The redis instance with the name {name} has not been registered");
if (this.instances.TryGetValue(name, out var service)) return service;
service = this.serviceProvider.GetRequiredService<Abstractions.IRedis>();
service.Initialize(value);
this.instances.TryAdd(name, service);
this.logger.LogInformation("Redis instance {Name} has been added to the factory", name);
return service; }}
Ejemplo de Uso
Este ejemplo muestra cómo inicializar y utilizar IRedis
en una aplicación de consola a través de IRedisFactory
y la inyección de dependencias de .NET.
using CodeDesignPlus.Net.Redis.Abstractions;using CodeDesignPlus.Net.Redis.Extensions;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using Newtonsoft.Json;
var configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build();
var serviceCollection = new ServiceCollection();
serviceCollection.AddLogging();serviceCollection.AddRedis(configuration);
var serviceProvider = serviceCollection.BuildServiceProvider();
var factory = serviceProvider.GetRequiredService<IRedisFactory>();
var service = factory.Create(FactoryConst.RedisCore);
var item = new { Id = 1, Name = "CodeDesignPlus"};
await service.Database.StringSetAsync("item", JsonConvert.SerializeObject(item));
var result = await service.Database.StringGetAsync("item");
Console.WriteLine(result);
Conclusiones
RedisServiceFactory
centraliza la creación de instancias de IRedis
, permitiendo manejar múltiples conexiones a Redis dentro de la aplicación de manera organizada. Al desacoplar la creación de los servicios Redis, la fábrica facilita la gestión de configuraciones y promueve la reutilización de código. Es un componente fundamental para las aplicaciones que necesitan conectarse a múltiples instancias de Redis, o cuando se requiere un nivel de abstracción en la creación de los servicios de Redis.