using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using CredentialManager.Data; using CredentialManager.Services; namespace CredentialManager; /// /// Classe per la configurazione del CredentialManager /// public static class CredentialManagerConfiguration { /// /// Registra i servizi del CredentialManager /// /// La collezione di servizi /// Il percorso del database SQLite (opzionale, default: credentials.db) /// La collezione di servizi public static IServiceCollection AddCredentialManager( this IServiceCollection services, string? databasePath = null) { // Imposta il percorso predefinito se non specificato databasePath ??= Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "CredentialManager", "credentials.db"); // Assicurati che la directory esista var directory = Path.GetDirectoryName(databasePath); if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) { Directory.CreateDirectory(directory); } // Registra il DbContext services.AddDbContext(options => options.UseSqlite($"Data Source={databasePath}")); // Registra i servizi services.AddScoped(); services.AddScoped(); services.AddScoped(); return services; } /// /// Inizializza il database del CredentialManager /// /// Il provider di servizi /// Task completato public static async Task InitializeCredentialManagerAsync(this IServiceProvider serviceProvider) { using var scope = serviceProvider.CreateScope(); var initializer = scope.ServiceProvider.GetRequiredService(); await initializer.InitializeAsync(); } } /// /// Factory per creare un'istanza standalone del CredentialManager /// public static class CredentialManagerFactory { /// /// Crea un'istanza standalone del CredentialManager /// /// Il percorso del database SQLite (opzionale) /// Factory per il logging (opzionale) /// Un'istanza di ICredentialService public static async Task CreateAsync( string? databasePath = null, ILoggerFactory? loggerFactory = null) { // Configurazione dei servizi var services = new ServiceCollection(); // Aggiungi logging se fornito if (loggerFactory != null) { services.AddSingleton(loggerFactory); services.AddLogging(); } else { services.AddLogging(builder => builder.AddConsole()); } // Aggiungi CredentialManager services.AddCredentialManager(databasePath); // Costruisci il provider di servizi var serviceProvider = services.BuildServiceProvider(); // Inizializza il database await serviceProvider.InitializeCredentialManagerAsync(); // Restituisci il servizio return serviceProvider.GetRequiredService(); } /// /// Crea un'istanza standalone del CredentialManager con configurazione personalizzata /// /// Azione per configurare servizi aggiuntivi /// Il percorso del database SQLite (opzionale) /// Il provider di servizi configurato public static async Task CreateServiceProviderAsync( Action? configureServices = null, string? databasePath = null) { var services = new ServiceCollection(); // Configurazione di base services.AddLogging(builder => builder.AddConsole()); services.AddCredentialManager(databasePath); // Configurazione personalizzata configureServices?.Invoke(services); // Costruisci il provider var serviceProvider = services.BuildServiceProvider(); // Inizializza il database await serviceProvider.InitializeCredentialManagerAsync(); return serviceProvider; } }