Files
Data-Coupler/DataConnection/CredentialManagement/ServiceCollectionExtensions.cs
T
Alessio 04f0403f12 feat: Implementato sistema di associazioni chiave per prevenire duplicati nel data coupling
BREAKING CHANGE: Rimosso completamente il vecchio sistema RecordAssociation

Modifiche principali:
- Sostituito RecordAssociation con KeyAssociation basato sui valori delle chiavi
- Implementata logica robusta di UPDATE vs INSERT basata su associazioni esistenti
- Aggiunta normalizzazione delle chiavi (.Trim()) per consistenza
- Implementato fallback nella ricerca associazioni per maggiore affidabilità
- Sostituita verifica pre-UPDATE con tentativo diretto più efficiente

Componenti modificati:
- Nuovo modello: KeyAssociation.cs con campi ottimizzati
- Nuovo servizio: KeyAssociationService.cs con metodi completi
- Aggiornato: DataCoupler.razor con logica migliorata di gestione associazioni
- Aggiornato: CredentialDbContext per gestire solo KeyAssociations
- Aggiornati: tutti i servizi di interfaccia per supportare il nuovo sistema
- Creata: pagina KeyAssociations.razor per gestione associazioni
- Aggiornato: NavMenu.razor con link alla gestione associazioni

Miglioramenti tecnici:
- Logica di UPDATE più robusta: tenta direttamente l'aggiornamento invece di verificare prima l'esistenza
- Gestione errori migliorata con cleanup automatico delle associazioni non valide
- Debug logging estensivo per troubleshooting
- Fallback nella ricerca associazioni se parametri specifici falliscono
- Normalizzazione valori chiave per prevenire problemi di whitespace

Risultato:
Il sistema ora previene correttamente i duplicati utilizzando le associazioni per decidere
se fare INSERT (nuovo record) o UPDATE (record esistente) basandosi sui valori delle chiavi.

Database:
- Creata migrazione EF per rimuovere RecordAssociations e aggiungere KeyAssociations
- Eliminati file e codice legacy non più necessari
2025-06-29 20:44:20 +02:00

107 lines
3.9 KiB
C#

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using CredentialManager;
using CredentialManager.Services;
using CredentialManager.Data;
using DataConnection.CredentialManagement.Interfaces;
using DataConnection.CredentialManagement.Services;
namespace DataConnection.CredentialManagement;
/// <summary>
/// Metodi di estensione per configurare i servizi di gestione credenziali per DataConnection
/// </summary>
public static class ServiceCollectionExtensions
{
/// <summary>
/// Aggiunge i servizi di gestione credenziali a DataConnection
/// </summary>
/// <param name="services">La collezione di servizi</param>
/// <param name="connectionString">Stringa di connessione per il database delle credenziali</param>
/// <returns>La collezione di servizi per il chaining</returns>
public static IServiceCollection AddDataConnectionCredentialManagement(
this IServiceCollection services,
string connectionString = "Data Source=credentials.db")
{
// Estrai il percorso del database dalla connection string
string databasePath;
if (connectionString.StartsWith("Data Source=", StringComparison.OrdinalIgnoreCase))
{
databasePath = connectionString.Substring("Data Source=".Length);
}
else
{
// Se non è una connection string, assumiamo che sia già un percorso
databasePath = connectionString;
}
// Aggiungi i servizi base di CredentialManager
services.AddCredentialManager(databasePath);
// Aggiungi il servizio di gestione associazioni per chiavi
services.AddScoped<IKeyAssociationService, KeyAssociationService>();
// Aggiungi il servizio di integrazione DataConnection
services.AddScoped<IDataConnectionCredentialService, DataConnectionCredentialService>();
return services;
}
/// <summary>
/// Aggiunge i servizi di gestione credenziali con configurazione avanzata
/// </summary>
/// <param name="services">La collezione di servizi</param>
/// <param name="configure">Azione per configurare le opzioni</param>
/// <returns>La collezione di servizi per il chaining</returns>
public static IServiceCollection AddDataConnectionCredentialManagement(
this IServiceCollection services,
Action<DataConnectionCredentialOptions> configure)
{
var options = new DataConnectionCredentialOptions();
configure(options);
return services.AddDataConnectionCredentialManagement(options.ConnectionString);
}
}
/// <summary>
/// Opzioni per la configurazione del DataConnectionCredentialManagement
/// </summary>
public class DataConnectionCredentialOptions
{
/// <summary>
/// Stringa di connessione per il database delle credenziali
/// </summary>
public string ConnectionString { get; set; } = "Data Source=credentials.db";
/// <summary>
/// Abilita il logging dettagliato
/// </summary>
public bool EnableDetailedLogging { get; set; } = false;
/// <summary>
/// Timeout per le operazioni sul database (in secondi)
/// </summary>
public int DatabaseTimeout { get; set; } = 30;
}
/// <summary>
/// Interfaccia per il servizio di gestione credenziali specifico per DataConnection
/// Questa interfaccia estende le funzionalità base di CredentialManager
/// con metodi specifici per l'integrazione con DataConnection
/// </summary>
public interface IDataConnectionCredentialServiceConfiguration
{
/// <summary>
/// Configura il servizio con le opzioni specificate
/// </summary>
/// <param name="options">Le opzioni di configurazione</param>
void Configure(DataConnectionCredentialOptions options);
/// <summary>
/// Verifica la connessione al database delle credenziali
/// </summary>
/// <returns>True se la connessione è valida</returns>
Task<bool> TestConnectionAsync();
}