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;
}
}