using CommunityToolkit.Maui; using Jugenddienst_Stunden.Models; using Jugenddienst_Stunden.Interfaces; using Jugenddienst_Stunden.Repositories; using Jugenddienst_Stunden.Services; using Jugenddienst_Stunden.Infrastructure; using Jugenddienst_Stunden.Validators; using Microsoft.Extensions.Logging; using ZXing.Net.Maui.Controls; using System.Net.Http; using Jugenddienst_Stunden.ViewModels; using Jugenddienst_Stunden.Views; using System.Net; namespace Jugenddienst_Stunden; /// /// Das Hauptprogramm. /// public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp() // Initialize the .NET MAUI Community Toolkit by adding the below line of code .UseMauiCommunityToolkit(options => { options.SetShouldEnableSnackbarOnWindows(true); }) .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }) .UseBarcodeReader(); // DI: AlertService für globale Alerts (z. B. leere ApiUrl) builder.Services.AddSingleton(); // DI: Settings aus Preferences (Single Source of Truth bleibt Preferences) builder.Services.AddSingleton(); // DI: ApiOptions IMMER aus aktuellen Settings erzeugen (nicht beim Start einfrieren) builder.Services.AddTransient(sp => new ApiOptions { BaseUrl = sp.GetRequiredService().ApiUrl, Timeout = TimeSpan.FromSeconds(15) }); // HttpClient + ApiClient Best Practices: // 1. IHttpClientFactory verwenden (vermeidet Socket Exhaustion & DNS Probleme) // 2. Typed Client für bessere Dependency Injection (AddHttpClient) // 3. DelegatingHandler für Logging/Infrastruktur einbinden builder.Services.AddTransient(); builder.Services.AddHttpClient() .ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler { AllowAutoRedirect = false, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, PooledConnectionLifetime = TimeSpan.FromMinutes(5), ConnectTimeout = TimeSpan.FromSeconds(10) }) .AddHttpMessageHandler() .SetHandlerLifetime(TimeSpan.FromMinutes(5)); // DI: Validatoren builder.Services.AddSingleton(); // DI: Services & Repositories builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); // DI: Views/ViewModels builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); return builder.Build(); } }