Press "Enter" to skip to content

2 – Uno user control per gestire i dati di connessione a SQL Server

In questo secondo post di questa breve serie facciamo un po’ di fondamenta, riepiloghiamo e aggiorniamo le classi per la gestione dei dati e l’helper per la crittografia e creiamo i due nuovi progetti per le nostre librerie di base.

La classe SqlConnectionInfo

Aggiungiamo alla classe base per la memorizzazione dei dati di connessione le funzionalitá per permettere di clonarla, in modo che nella UI che implementeremo possiamo creare in modo semplice la funzione Duplica.

public void CopyTo(SqlConnectionInfo newItem)
{
	//From Connection base
	newItem.ConnectionID = this.ConnectionID;
	newItem.ConnectionType = this.ConnectionType;
	newItem.Description = this.Description;
	newItem.Position = this.Position;
	//Specific properties
	newItem.CommandsTimeout = this.CommandsTimeout;
	newItem.ConnectionTimeout = this.ConnectionTimeout;
	newItem.Database = this.Database;
	newItem.Password = this.Password;
	newItem.Server = this.Server;
	newItem.Trusted = this.Trusted;
	newItem.Username = this.Username;
}

public SqlConnectionInfo Clone()
{
	SqlConnectionInfo item = new SqlConnectionInfo();
	this.CopyTo(item);
	return (item);
}

Abbiamo suddiviso in 2 metodi la funzione di duplicazione, in modo da permettere due operazioni, la generazione di una nuova istanza duplicata (Clone) e la copia (in questo caso è una Shallow copy ma anche una Deep copy perché gli elementi della classe sono tutti tipi di base .Net) del contenuto in un istanza fornita al metodo Copy.

La classe SqlConnectionInfosCollection

Abbiamo introdotto questa collezione nell’articolo dedicato alla serializzazione JSON, ora andiamo a modificarla per fare in modo che sappia da sola come fare a serializzarsi in formato JSON. Nel caso non la trovaste, si trova nel progetto DnwBaseDataSqlserver, nella cartella Collections. La riportiamo per intero evidenziando i metodi di serializzazione.

using Dnw.Base.Data.SqlServer.Entities;
using Dnw.Base.Json;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
 
 
 
namespace Dnw.Base.Data.SqlServer.Collections
{
	public class SqlConnectionInfosCollection : ObservableCollection<SqlConnectionInfo>
	{
 
 
		public SqlConnectionInfo this[string ID]
		{
			get
			{
				SqlConnectionInfo x = null;
				if (this.Any(item => item.ConnectionID == ID))
				{
					x = this.First(item => item.ConnectionID == ID);
				}
				return (x);
			}
		}
 
		public override string ToString()
		{
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < this.Count; i++)
			{
				sb.AppendLine(this[i].ToString());
			}
			return (sb.ToString());
		}
 
 
		public string Serialize()
		{
			return (JsonHelper.Serialize(typeof(SqlConnectionInfosCollection), this));
		}
 
		public void Serialize(string fileName)
		{
			JsonHelper.Serialize(typeof(SqlConnectionInfosCollection), this, fileName);
		}
 
		public static SqlConnectionInfosCollection Deserialize(string fileOrData, bool isFile = true)
		{
			return ((SqlConnectionInfosCollection)JsonHelper.Deserialize(typeof(SqlConnectionInfosCollection), fileOrData, isFile));
		}
	}

	public SqlConnectionInfosCollection Clone()
	{
		SqlConnectionInfosCollection newData = new SqlConnectionInfosCollection();
		foreach (SqlConnectionInfo item in this)
		{
			newData.Add(item.Clone());
		}
		return (newData);
	}
}

I metodi che abbiamo aggiunto sono Serialize – che genera la rappresentazione JSON della classe su una stringa o la memorizza su un file, e Deserialize, che è in grado di deserializzare un file o una stringa contenente la rappresentazione JSON della classe. Infine il metodo Clone, che crea una Deep Copy di questa collection e ci serve per poter predisporre l’Undo delle operazioni di modifica.

La classe EncDec

Visto che abbiamo deciso di implementare un sistema per la gestione delle stringhe di connessione in grado di salvare i dati su file, vogliamo essere in grado di salvarli in modalitá crittografata, pertanto facciamo una modifica alla funzione Decrypt dell’helper di crittografia e aggiungiamo un metodo Encrypt che sia in grado di salvare i dati su file.

public static void Encrypt(string text, string fileName)
{
	try
	{

		string encryptedData = Encrypt(text);
		File.WriteAllText(fileName, encryptedData);
	}
	catch (Exception ex)
	{
		EventLogger.SendMsg(ex);
		throw;
	}
}

Abbiamo introdotto una ulteriore funzione di crittografia che salva il risultato su un file dati.

public static string Decrypt(string encryptedTextOrFileName, bool isFileName = false)
{
	try
	{
		byte[] dataArray = null;
		if (!isFileName)
		{
			dataArray = Convert.FromBase64String(encryptedTextOrFileName);
		}
		else
		{
			dataArray = Convert.FromBase64String(File.ReadAllText(encryptedTextOrFileName));
		}
		PasswordDeriveBytes passwordDeriveByte =
			new PasswordDeriveBytes(Properties.Resources.CryptoData, mBytes	);
		byte[] hiddenArray = EncDec.Decrypt(dataArray,
			passwordDeriveByte.GetBytes(32), passwordDeriveByte.GetBytes(16));
		return Encoding.Unicode.GetString(hiddenArray);

	}
	catch (Exception ex)
	{
		EventLogger.SendMsg(ex);
		throw;
	}
}

Abbiamo modificato la funzione di decrittografia in modo che sia in grado di leggere la stringa crittografata anche da un file.

Due nuovi progetti nella soluzione DnwLibraries

Per implementare il nuovo User Control, aggiungeremo due progetti alla soluzione contenente le librerie di base Dotnetwork.

Wpf_UC_01[1]

Il progetto DnwBaseWpf sará usato come contenitore di tutto quello che sono i mattoncini piú generici di WPF per le nostre applicazioni, alla fine di questa serie di articoli, vi troveremo dei converter e degli stili riutilizzabili in tutte le nostre future librerie o applicazioni WPF.

wpf_uc_05[1]

Abbiamo modificato le proprietá di progetto per dare un nome nel formato giá usato per le altre librerie da noi create ed abbiamo anche predisposto il Default Namespace per la libreria.

wpf_uc_04[1]

Abbiamo anche inserito nel Post Build event della libreria la sua pubblicazione su una cartella del mio disco B: per fare in modo che tutte le applicazioni in cui la utilizzeremo la referenzino dallo stesso punto e possano se necessario farne il debug. Chi userá le librerie, se

WPF_UC_02[1]

Il progetto DnwUISqlServer conterrá il nostro User Control e potrá in futuro contenere ulteriori controlli o codice specifico per WPF dedicato alla modifica di dati correlati a SQL Server.

WPF_UC_03[1]

Anche per il secondo progetto abbiamo modificato il nome della DLL prodotta ed il default namespace ed abbiamo introdotto nel post build event la pubblicazione della libreria ad uso dei progetti di test o delle implementazioni che faremo in futuro.

Ricordiamo che come per tutti i nostri progetti, abbiamo Firmato gli assembly per dar loro uno Strong Name, se non sapete per quale motivo  QUI trovate qualche indizio.

Abbiamo creato delle fondamenta per l’implementazione del nostro User Control, nella parte 3 di questa serie di articoli inizieremo a costruire lo User control e parleremo di concetti e applicazione di concetti in WPF.

Il progetto di esempio che contiene il codice come sarà alla fine della serie è disponibile nella nuova versione delle librerie di uso comune a questo indirizzo:

Per qualsiasi domanda, curiosità approfondimento, potete usare il link al modulo di contatto in cima alla pagina.

Aggiungo i riferimenti alle librerie di supporto che saranno utilizzate anche negli articoli successivi.