using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using server; using server.Services; using server.Utilierias; using ServicesDAO.Data; using ServicesDAO.Repositories; var builder = WebApplication.CreateBuilder(args); // 0. Cadenas de conexión: en desarrollo local se cargan desde un archivo NO // versionado (appsettings.secrets.json); en producción (k8s) se inyectan como // variables de entorno (ConnectionStrings__Main) vía Secret de Helm. El archivo // es opcional a propósito, pero se re-agrega AddEnvironmentVariables() después // para que las variables de entorno tengan la última palabra sobre el archivo // local si ambos están presentes (mismo orden que ya usa // tests/DynamicCrud.Tests/Fixtures/DbContextFixture.cs). builder.Configuration .AddJsonFile("appsettings.secrets.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); // 1. Configuración de Kestrel (Lógica encapsulada) builder.ConfigureKestrelServer(); // 2. Base de Datos var connectionString = builder.Configuration.GetConnectionString("Main") ?? throw new InvalidOperationException( "ConnectionStrings:Main no está configurado. Defina appsettings.secrets.json " + "(desarrollo) o la variable de entorno ConnectionStrings__Main (producción)."); builder.Services.AddDbContext(options => options.UseMySQL(connectionString, mySqlOptions => mySqlOptions.EnableRetryOnFailure( maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null)) .UseSnakeCaseNamingConvention() ); // 3. Inyección de Dependencias // Repositorios builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); // Legacy DataAccess builder.Services.AddScoped(); // Servicios Legacy (Ojo: Si son stateless, pueden ser Scoped ahora) builder.Services.AddScoped(); builder.Services.AddScoped(); // 4. Configurar gRPC Core builder.Services.AddGrpc(options => { options.Interceptors.Add(); }); builder.Services.AddSingleton(); // Reflection y Health builder.Services.AddGrpcReflection(); builder.Services.AddGrpcHealthChecks() .AddCheck("General_Liveness", tags: new[] { "liveness" }) .AddCheck("Database_Readiness", tags: new[] { "readiness" }); var app = builder.Build(); // 5. Mapear Servicios (Lógica encapsulada) app.MapAllGrpcServices(); app.Run(); //// --- CONFIGURACIÓN DEL HOST GENÉRICO (.NET 8 STYLE) --- //var builder = Host.CreateDefaultBuilder(args); //builder.ConfigureServices((context, services) => //{ // // 1. Configuración de Base de Datos (EF Core) // var connectionString = context.Configuration.GetConnectionString("Main"); // services.AddDbContext(options => // options.UseMySql(connectionString, // new MariaDbServerVersion(new Version(11, 4, 7)), // mySqlOptions => mySqlOptions.EnableRetryOnFailure( // maxRetryCount: 5, // maxRetryDelay: System.TimeSpan.FromSeconds(30), // errorNumbersToAdd: null)) // .UseSnakeCaseNamingConvention() // ); // // 2. Registrar Repositorios (Capa de Datos) // services.AddScoped(); // services.AddScoped(); // Legacy // /*** Se agrega el repository de consulta de disponibilidad de la base de datos ***/ // services.AddScoped(); // // 3. Registrar Implementaciones gRPC (Capa de API) // services.AddSingleton(); // Legacy (Nota: Grpc.Core suele usar Singleton para la instancia del servicio) // services.AddSingleton(); // Legacy // services.AddScoped(); // Público // services.AddScoped(); // Nuevo (Interno) // services.AddScoped(); // Nuevo (Catálogo) // // --------------------------------------------------------------- // // ZONA DE HEALTH CHECKS // // --------------------------------------------------------------- // // services.AddHealthChecks() // services.AddGrpcHealthChecks() // // 1. Check General (Liveness) - Usando tu clase // .AddCheck("General_Liveness", tags: new[] { "liveness" }) // // 2. Check de Base de Datos (Readiness) - Usando el esqueleto creado // // Nota: El nombre 'Database_Readiness' es como aparecerá en el reporte. // .AddCheck("Database_Readiness", tags: new[] { "readiness" }); // // Habilitar soporte de Salud para gRPC // // (Esto permite que 'grpc-health-probe' consulte el estado sin necesitar HTTP) // // services.AddGrpcHealthChecks(); // // services.AddHostedService(); // // --------------------------------------------------------------- // // 4. Utilidades e Interceptores // services.AddSingleton(); // // 5. REGISTRAR EL HOSTED SERVICE (El que arranca el servidor) // // Esto reemplaza toda la lógica manual de Start/WaitOne que tenías antes. // services.AddHostedService(); //}); //// Construir y Correr la aplicación //var host = builder.Build(); //// Log de inicio opcional //var logger = host.Services.GetRequiredService>(); //logger.LogInformation("Iniciando aplicación..."); //await host.RunAsync();