Opciones de configuración
El patrón de opciones es una técnica común en aplicaciones .NET que permite centralizar la configuración en un solo lugar, facilitando la gestión y validación de las opciones de configuración. En el contexto de la librería CodeDesignPlus.Net.Redis, se utiliza para definir cómo se conectará la aplicación a las instancias de Redis y cómo se configurarán estas conexiones.
RedisOptions
La clase RedisOptions
proporciona un conjunto de opciones que pueden configurarse en el archivo appsettings.json
de tu aplicación. Estas opciones son esenciales para definir cómo la librería CodeDesignPlus.Net.Redis
se conectará y operará con las diferentes instancias de Redis.
namespace CodeDesignPlus.Net.Redis.Options;
/// <summary>/// Represents the configuration options for Redis./// </summary>public class RedisOptions : IValidatableObject{ /// <summary> /// The configuration section name for Redis options. /// </summary> public const string Section = "Redis";
/// <summary> /// Gets or sets the dictionary of Redis instances. /// </summary> public Dictionary<string, Instance> Instances { get; set; } = new();
/// <summary> /// Validates the properties of the <see cref="RedisOptions"/> instance. /// </summary> /// <param name="validationContext">The context information about the validation operation.</param> /// <returns>A collection of validation results.</returns> public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { var result = new List<ValidationResult>();
if (Instances.Count == 0) result.Add(new ValidationResult("The Instances list must not be empty.", new[] { nameof(this.Instances) }));
foreach (var instance in this.Instances.Where(x => x.Value.CreateConfiguration().Ssl && string.IsNullOrEmpty(x.Value.Certificate))) { result.Add(new ValidationResult("The Certificate is required.", new[] { nameof(Instance.Certificate) })); }
return result; }}
Propiedades
-
Section
- Tipo:
string
- Descripción: El nombre de la sección de configuración en
appsettings.json
donde se encuentran las opciones de Redis. - Valor Predeterminado:
"Redis"
- Tipo:
-
Instances
- Tipo:
Dictionary<string, Instance>
- Descripción: Un diccionario que contiene la configuración para cada instancia de Redis. Cada entrada en el diccionario tiene una clave que representa el nombre de la instancia y un valor que representa la configuración de la instancia (
Instance
). - Valor Predeterminado:
new Dictionary<string, Instance>()
(diccionario vacío)
- Tipo:
Validación
La clase RedisOptions
implementa IValidatableObject
para realizar validaciones adicionales al inicializar las opciones. En este ejemplo, se asegura de que la lista Instances
no esté vacía y que, si se requiere SSL, el certificado se especifique.
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext){ var result = new List<ValidationResult>();
if (Instances.Count == 0) result.Add(new ValidationResult("The Instances list must not be empty.", new[] { nameof(this.Instances) }));
foreach (var instance in this.Instances.Where(x => x.Value.CreateConfiguration().Ssl && string.IsNullOrEmpty(x.Value.Certificate))) { result.Add(new ValidationResult("The Certificate is required.", new[] { nameof(Instance.Certificate) })); }
return result;}
Instance
La clase Instance
define la configuración específica para una instancia de Redis dentro del diccionario Instances
en RedisOptions
.
namespace CodeDesignPlus.Net.Redis.Abstractions;
/// <summary>/// Represents the configuration for a Redis instance, allowing for customization of various settings related to the connection and operation of Redis within the context of a microservice./// </summary>public class Instance{ /// <summary> /// Gets or sets the connection string used for connecting to the Redis server. /// It can include several configuration parameters like EndPoints, Password, and more, separated by commas. /// </summary> [Required] [RegularExpression(@"^(\w+=\w+)(,\w+=\w+)*$", ErrorMessage = "Invalid connection string format.")] public string ConnectionString { get; set; }
/// <summary> /// Gets or sets a value indicating whether to use ThreadPriority.AboveNormal for SocketManager reader and writer threads. /// If false, ThreadPriority.Normal will be used. Default is true. /// </summary> public bool HighPrioritySocketThreads { get; set; } = true;
/// <summary> /// Gets or sets the file path to the PFX certificate used for SSL connections. /// </summary> public string Certificate { get; set; }
/// <summary> /// Gets or sets the password for the PFX certificate. /// </summary> public string PasswordCertificate { get; set; }
/// <summary> /// Creates a new instance of <see cref="ConfigurationOptions"/> based on the current instance properties. /// </summary> /// <returns>The options relevant to a set of Redis connections.</returns> public ConfigurationOptions CreateConfiguration() { var configuration = ConfigurationOptions.Parse(this.ConnectionString);
configuration.SocketManager = new SocketManager("RedisInstance", this.HighPrioritySocketThreads);
return configuration; }}
Propiedades
-
ConnectionString
- Tipo:
string
- Descripción: La cadena de conexión utilizada para conectarse al servidor Redis. Puede incluir varios parámetros como endpoints, contraseñas y más. Debe seguir el formato
clave=valor,clave=valor,...
- Valor Predeterminado: Ninguno (es requerido)
- Validación: Se valida que cumpla con el formato de string esperado usando una expresión regular.
- Tipo:
-
HighPrioritySocketThreads
- Tipo:
bool
- Descripción: Indica si se debe usar
ThreadPriority.AboveNormal
para los hilos del SocketManager. Si esfalse
, se usaráThreadPriority.Normal
. - Valor Predeterminado:
true
- Tipo:
-
Certificate
- Tipo:
string
- Descripción: La ruta del archivo PFX del certificado usado para conexiones SSL.
- Valor Predeterminado:
null
(opcional a menos que SSL esté habilitado)
- Tipo:
-
PasswordCertificate
- Tipo:
string
- Descripción: La contraseña para el certificado PFX.
- Valor Predeterminado:
null
(opcional)
- Tipo:
Métodos
CreateConfiguration()
Crea una instancia de ConfigurationOptions
de StackExchange.Redis
basado en las propiedades actuales de Instance
retornando un objeto ConfigurationOptions
que se utiliza para configurar la conexión a Redis.
public ConfigurationOptions CreateConfiguration(){ var configuration = ConfigurationOptions.Parse(this.ConnectionString);
configuration.SocketManager = new SocketManager("RedisInstance", this.HighPrioritySocketThreads);
return configuration;}
Ejemplo de Configuración
A continuación se muestra un ejemplo de archivo appsettings.json
que configura las opciones de Redis:
{ "Core": { "Business": "CodeDesignPlus", "AppName": "sample-redis-standalone", "Version": "v1", "Description": "Sample of CodeDesignPlus.Net.Core", "Contact": { "Name": "CodeDesignPlus", "Email": "custom@outlook.com" } }, "Redis": { "Instances": { "Core": { "ConnectionString": "localhost:6379" } } }}
{ "Core": { "Business": "CodeDesignPlus", "AppName": "sample-redis-standalone-tls", "Version": "v1", "Description": "Sample of CodeDesignPlus.Net.Core", "Contact": { "Name": "CodeDesignPlus", "Email": "custom@outlook.com" } }, "Redis": { "Instances": { "Core": { "ConnectionString": "localhost:6380,ssl=true,password=12345678,resolveDns=false,sslprotocols=tls12|tls13", "Certificate": "server/Certificates/client.pfx", "PasswordCertificate": "Temporal1" } } }}
{ "Core": { "Business": "CodeDesignPlus", "AppName": "sample-redis-cluster", "Version": "v1", "Description": "Sample of CodeDesignPlus.Net.Core", "Contact": { "Name": "CodeDesignPlus", "Email": "custom@outlook.com" } }, "Redis": { "Instances": { "Core": { "ConnectionString": "redis-node-1:7000,redis-node-2:7001,redis-node-3:7002,redis-node-4:7003,redis-node-5:7004,redis-node-6:7005,password=12345678,abortConnect=false" } } }}
{ "Core": { "Business": "CodeDesignPlus", "AppName": "sample-redis-cluster-tls", "Version": "v1", "Description": "Sample of CodeDesignPlus.Net.Core", "Contact": { "Name": "CodeDesignPlus", "Email": "custom@outlook.com" } }, "Redis": { "Instances": { "Core": { "ConnectionString": "redis0:7379,redis1:7380,redis2:7381,redis3:7382,redis4:7383,redis5:7384,ssl=true,password=12345678,resolveDns=false,sslprotocols=tls12|tls13", "Certificate": "server/Certificates/client.pfx", "PasswordCertificate": "Temporal1" } } }}