Files
Mercados-Web/src/Mercados.Worker/Program.cs

69 lines
3.0 KiB
C#
Raw Normal View History

using System.Text;
using Mercados.Infrastructure;
using Mercados.Infrastructure.DataFetchers;
using Mercados.Infrastructure.Persistence;
using Mercados.Infrastructure.Persistence.Repositories;
using Mercados.Worker;
using Polly;
using Polly.Extensions.Http;
using Mercados.Infrastructure.Services;
using DotNetEnv;
using DotNetEnv.Configuration;
var envFilePath = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "../../../../../.env"));
// Cargamos el archivo .env desde la ruta explícita.
// Si no lo encuentra, Load retornará false.
if (!Env.Load(envFilePath).Any())
{
Console.WriteLine($"ADVERTENCIA: No se pudo encontrar el archivo .env en la ruta: {envFilePath}");
}
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
// La línea 'config.AddDotNetEnv(optional: true);' ha sido eliminada.
IConfiguration configuration = hostContext.Configuration;
// --- 1. Registro de Servicios de Infraestructura ---
services.AddSingleton<IDbConnectionFactory, SqlConnectionFactory>();
services.AddScoped<ICotizacionGanadoRepository, CotizacionGanadoRepository>();
services.AddScoped<ICotizacionGranoRepository, CotizacionGranoRepository>();
services.AddScoped<ICotizacionBolsaRepository, CotizacionBolsaRepository>();
services.AddScoped<IFuenteDatoRepository, FuenteDatoRepository>();
//services.AddScoped<INotificationService, ConsoleNotificationService>();
services.AddScoped<INotificationService, EmailNotificationService>();
// --- 2. Registro de los Data Fetchers ---
// Descomentados para la versión final y funcional.
services.AddScoped<IDataFetcher, MercadoAgroFetcher>();
services.AddScoped<IDataFetcher, BcrDataFetcher>();
services.AddScoped<IDataFetcher, FinnhubDataFetcher>();
services.AddScoped<IDataFetcher, YahooFinanceDataFetcher>();
// --- 3. Configuración de Clientes HTTP con Polly ---
services.AddHttpClient("MercadoAgroFetcher").AddPolicyHandler(GetRetryPolicy());
services.AddHttpClient("BcrDataFetcher").AddPolicyHandler(GetRetryPolicy());
services.AddHttpClient("FinnhubDataFetcher").AddPolicyHandler(GetRetryPolicy());
// --- 4. Registro del Worker Principal ---
services.AddHostedService<DataFetchingService>();
})
.Build();
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.RequestTimeout)
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
onRetry: (outcome, timespan, retryAttempt, context) =>
{
Console.WriteLine($"[Polly] Reintentando petición... Intento {retryAttempt}. Esperando {timespan.TotalSeconds}s. Causa: {outcome.Exception?.Message ?? outcome.Result.ReasonPhrase}");
});
}
await host.RunAsync();