Servicios Singleton

Un servicio Singleton en .NET es un tipo de servicio que garantiza la creación de una única instancia de un objeto a lo largo de toda la vida útil de la aplicación. Esta instancia única se comparte en todas las partes de la aplicación donde se requiera dicho servicio.

🔍 Características de los Servicios Singleton

Instancia Única:

🔹 Solo se crea una instancia del servicio durante la vida útil de la aplicación.

🔹 La misma instancia se utiliza en todas las solicitudes y en todas las partes de la aplicación.

Creación de Instancia:

🔹 Se crea la primera vez que se solicita.

🔹 Posteriormente, siempre se devuelve la misma instancia ya creada.

Compartición de Estado:

🔹 Dado que todos los consumidores del servicio comparten la misma instancia, cualquier estado mantenido en el servicio es compartido.

🔹 Esto puede ser útil para almacenar información de configuración, caché, conexiones a bases de datos, etc.

Ciclo de Vida:

🔹 La instancia del servicio se destruye cuando la aplicación se detiene o se reinicia.

⚠️ Consideraciones de Uso

🔹 Manejo de Estado: Debido a que es compartido por todos los consumidores, es crucial diseñar cuidadosamente cualquier estado que el servicio mantenga para evitar condiciones de carrera y problemas de concurrencia.

🔹 Dependencias: Si un servicio Singleton depende de servicios con ciclos de vida más cortos (como Scoped o Transient), puede llevar a problemas de diseño y errores en tiempo de ejecución.

🔹 Pruebas: Puede ser más difícil escribir pruebas unitarias para clases que dependen de servicios Singleton debido a su estado compartido y persistente.

🖥 Ejemplo de Implementación

Vamos a ver un ejemplo de cómo se podría implementar y utilizar un servicio Singleton:

public interface IConfiguracionSingleton
{
    string ObtenerConfiguracion();
}

public class ConfiguracionSingleton : IConfiguracionSingleton
{
    private string _configuracion;

    public ConfiguracionSingleton()
    {
        // Aquí se podría cargar la configuración desde un archivo, por ejemplo
        _configuracion = "Configuración Inicial";
    }

    public string ObtenerConfiguracion()
    {
        return _configuracion;
    }

    public void EstablecerConfiguracion(string nuevaConfiguracion)
    {
        _configuracion = nuevaConfiguracion;
    }
}

public class Startup
{
    // Registro del servicio como Singleton
        services.AddSingleton<IConfiguracionSingleton, ConfiguracionSingleton>();

    // Otros métodos de la clase Startup...
}

public class MiControlador : Controller
{
    private readonly IConfiguracionSingleton _configuracion;

    public MiControlador(IConfiguracionSingleton configuracion)
    {
        _configuracion = configuracion;
    }

    public IActionResult Index()
    {
        var configuracionActual = _configuracion.ObtenerConfiguracion();
        // Utilizar la configuración para alguna lógica de la vista
        return View();
    }
}

Última actualización