es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Accediendo a la base de datos de EF Core al inicio para establecer valores constantes para la inyección de dependencias.

Tengo un conjunto de valores constantes en una base de datos. Idealmente, me gustaría leerlos una vez durante el inicio para no tener que volver a la base de datos cada vez. Actualmente tengo EF Core y normalmente pasaría IDbContext. Para empezar, tenía:

services.AddScoped<idatabaseconstants,databaseconstants>();

Entonces mi clase de constantes sería

public DatabaseConstants : IDatabaseConstants{
private int _value;
public DatabaseConstants(IDbContext dbContext)
{
_value = dbContext.Table.Where( ….
}

public int GetConstantValue() => _value;

}

Pero como está limitado, leería desde la base de datos cada vez que llamara a GetConstantValue().

Estoy pensando que necesito algo así en mi DependencyInjection.cs

services.AddSingleton(new DatabaseConstants());

Entonces mi clase Constants sería

public DatabaseConstants : IDatabaseConstants{
private int _value;
public DatabaseConstants()
{
_value = ReadFromDatabase();
}

public int GetConstantValue() => _value;

}

El problema es que no estoy seguro de cómo acceder a mi base de datos con esta configuración.

¿Existe un patrón para leer desde la base de datos al inicio?</idatabaseconstants,databaseconstants>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay un patrón para leer desde la base de datos al inicio. Una de las formas es utilizar el patrón de diseño Singleton para asegurarse de que la base de datos solo se lea una vez durante el inicio y luego se cachée en memoria. Aquí hay una posible implementación:

    1. Definir una interfaz para las constantes de la base de datos:
    public interface IDatabaseConstants {
        int GetConstantValue();
    }
    
    1. Implementar la interfaz usando una clase que lea las constantes desde la base de datos:
    public class DatabaseConstants : IDatabaseConstants {
        private readonly int _value;
    
        public DatabaseConstants(IDbContext dbContext) {
            _value = dbContext.Table.Where( .... // Leer las constantes desde la base de datos
        }
    
        public int GetConstantValue() => _value;
    }
    
    1. Configurar la inyección de dependencias para utilizar una instancia Singleton de la clase DatabaseConstants:
    services.AddSingleton<idatabaseconstants>(provider => {
        using (var scope = provider.CreateScope()) {
            var dbContext = scope.ServiceProvider.GetRequiredService<idbcontext>();
            return new DatabaseConstants(dbContext);
        }
    });
    

    El método CreateScope asegura que la instancia IDbContext se crea y se elimina dentro del alcance de vida del singleton IDatabaseConstants, lo que evita problemas de concurrencia.

    1. Utilizar la interfaz IDatabaseConstants en su código para acceder a las constantes cachéadas:
    public class SomeController : Controller {
        private readonly IDatabaseConstants _constants;
    
        public SomeController(IDatabaseConstants constants) {
            _constants = constants;
        }
    
        public IActionResult Index() {
            var value = _constants.GetConstantValue();
            // ...
        }
    }
    

    Este enfoque debería funcionar bien para conjuntos de datos pequeños que se pueden cachear en memoria sin problemas de rendimiento. Sin embargo, si tiene una gran cantidad de datos, podría considerar otras técnicas como la carga perezosa o el caché solo de las constantes más accesadas con frecuencia.

Comments are closed.