Mappare campi e proprietà con la reflection di .Net 3.5

18. luglio 2010 13.43

Il tutorial che vi propongo quest’oggi nasce da un’esigenza ben precisa: mi sono trovato a dover mappare due classi “identiche” se non nel fatto che la prima esponeva i propri dati privati attraverso proprietà pubbliche, la seconda rendendo pubblici proprio i campi dei dati. Sostanzialmente in codice

class GTPersonaPrimoTipo
{
    public String name;
    public String surname;
}

e

class GTPersonaSecondoTipo
{
    public String name { get; set; }
    public String surname { get; set; }
}

Il framework .Net ci viene incontro con la reflection grazie alla quale ho potuto scrivere il seguente metodo:

void mapObject(object typeOne, object typeTwo)
{
    Type type1 = typeOne.GetType();
    Type type2 = typeTwo.GetType();

    PropertyInfo[] property2 = type2.GetProperties();
    FieldInfo[] field1 = type1.GetFields();

    for (int i = 0; i < property2.Length; i++)
    {
        if (property2[i].Name == field1[i].Name)
        {
            String sValue = field1[i].GetValue(typeOne).ToString();
            property2[i].SetValue(typeTwo, sValue, null);
        }
    }
}

Metodo molto semplice: passo due oggetti generici alla metodo, ricavo il loro tipo. Ottengo un array di oggetti ProperyInfo che conterrà le proprietà della classe GTPersonaSecondoTipo e un array di oggetti FieldInfo che conterrà i campi pubblici della classe GTPersonaPrimoTipo.
A questo punto non mi resta che da ciclare sulle proprietà della seconda classe, e quando il nome della proprietà della seconda classe è uguale al nome del campo della prima, "copiare" il valore del campo nella proprietà.

 

Ecco come poter testare il codice precedente in un progetto GTPersonaPrimoTipo:

static void Main(string[] args)
{
    GTPersonaPrimoTipo personaPrimoTipo = new GTPersonaPrimoTipo();
    GTPersonaSecondoTipo personaSecondoTipo = new GTPersonaSecondoTipo();

    personaPrimoTipo.name = "Gennaro Eduardo";
    personaPrimoTipo.surname = "Tangari";

    mapObject(personaPrimoTipo, personaSecondoTipo);

    System.Console.WriteLine("{0}, {1}", personaSecondoTipo.surname.ToUpper(), personaSecondoTipo.name);
    System.Console.ReadLine();
}

Drag and drop su Windows Form con .Net e C#

18. luglio 2010 13.36

Il breve tutorial di quest’oggi ci guiderà a realizzare una semplice applicazione Windows Form sulla cui form principale sono presenti due ListBox sulle quali vogliamo abilitare ed implementare il drag and drop (sarà quindi possibile “trascinare” un elemento da una form all’altra oltre che su se stessa cambiandone l’ordine).

Tutto quello che dobbiamo fare è a questo punto creare un nuovo progetto Windows Form con Visual Studio e trascinare due ListBox, chiamandole rispettivamente lst1 e lst2 sulla form appena creata.

Possiamo utilizzare l’evento Load della form principale per popolare la prima lista oltre che abilitare il drag and drop su ambedue con il seguente codice:

 

lst1.Items.Add("Primo");
lst1.Items.Add("Secondo");
lst1.Items.Add("Terzo");
lst1.Items.Add("Quarto");
lst1.Items.Add("Quinto");
lst1.Items.Add("Sesto");
lst1.Items.Add("Settimo");

lst1.AllowDrop = true;
lst2.AllowDrop = true;

A questo punto dobbiamo prendere in considerazione tre eventi: il primo MouseDown sulla prima ListBox e i secondi due, DragOver e DragDrop, sulla seconda ListBox. Vediamo questi passi più in dettaglio

 

private void lst1_MouseDown(object sender, MouseEventArgs e)
{
     if (lst1.Items.Count > 0)
     {
          int index = lst1.SelectedIndex;

          string s = lst1.Items[index].ToString();

          DragDropEffects dde = DoDragDrop(s, DragDropEffects.All);

          if (dde == DragDropEffects.All)
          {
               lst1.Items.RemoveAt(lst1.SelectedIndex);
          }
     }
}

Il significato delle operazioni da compiere allo scatenarsi di quest’evento sono molto semplici: se abbiamo almeno un elemento sulla ListBox “sorgente” (che in questo caso è la prima) prendiamo l’indice dell’elemento selezionato ed otteniamo il testo dell’elemento stesso conservandolo in una stringa. A questo punto, tramite il metodo DoDragDrop possiamo iniziare l’operazione di trascinamento. Se il metodo stesso restituirà uno dei valori appartenenti all’enumerazione DragDropEffects.All, vorrà dire che il drag and drop è avvenuto correttamente e quindi possiamo rimuovere dalla ListBox l’elemento precedentemente selezionato.

 

Ora passiamo all’evento DragOver, scatenato dopo il DragEnter, sulla seconda ListBox: qui ci limiteremo ad informare che abbiamo accettato l’evento di drag and drop stesso:

private void lst2_DragOver(object sender, DragEventArgs e)
{
     e.Effect = DragDropEffects.All;
}

Non ci resta a questo punto che passare all’implementazione dell’ultimo evento sulla seconda ListBox: DragDrop

private void lst2_DragDrop(object sender, DragEventArgs e)
{
     if (e.Data.GetDataPresent(DataFormats.StringFormat))
     {
          string str = (string)e.Data.GetData(DataFormats.StringFormat);
          lst2.Items.Add(str);
     }
}

Le operazioni che l’evento compierà sono le seguenti: se il formato dei dati “trascinati” è una stringa, leggo la stringa stessa e l’aggiungo alla seconda ListBox.

 

Da notare che al compimento di quest’evento, nel MouseDown della prima ListBox leggeremo il valore “all” per dde il che ci permetterà di cancellare l’elemento dalla lista stessa.

Creare, pubblicare e consumare un WCF con Visual Studio 2008, .Net 3.5 e C#

18. luglio 2010 13.03

Il tutorial che vi propongo oggi è ben esplicato dal suo titolo: alla fine di queste pagine sarete in grado di creare un WCF, pubblicare con un’applicazione ad hoc scritta da voi stessi e consumarla con una vostra applicazione client.

Nella vita reale probabilmente non scrivere mai una vostra applicazione per fare l’host di un WCF, probabilmente utilizzere IIS che fa egregiamente questo lavoro, ma in alcuni casi potrebbe essere necessario farlo e sicuramente sapere che esiste questa possibilità oltre che saperla implementare è cosa buona e giusta.

 

Introduzione

Windows Communication Foundation o più brevemente WCF è un framework in cui la Microsoft fa confluire in un modello di programmazione unico tutte le precedenti tecnologie di comunicazione tra processi: WebServices, MSMQ, .Net Remoting ecc. ecc.

Cambiare la tecnologia con cui comunicare non significherà più, con WCF, riscrivere l’applicazione o il servizio, ma “semplicemente” riconfigurare WCF (tramite il file di configurazione dell’applicazione: in breve l’App.Config o il Web.Config a seconda dei casi) in modo tale da cambiarne il comportamento.

I mattoncini che compongono un WCF sono i seguenti: ServiceContract con i suoi OperationContract ovvero un’interfaccia (il ServiceContract) che descriverà cosa il WCF dovrà fare tramite i metodi da implementare (gli OperationContract). Il DataContract ovvero i dati che il servizio WCF e l’applicazione chiamante potranno scambiare e il connesso MessageContract ovvero come la struttura dati rappresentata da un DataContract può essere serializzata in un messaggio SOAP.

Importantissimo è poi il concetto di EndPoint che a sua volta è formato da tra elementi: Address ovvero l’indirizzo cui le applicazioni che devono inoltrare chiamate al servizio devono puntare, il Binding ovvero la modalità in cui il servizio viene esposto (Soap tramite basicHttpBindig/wsHttpBindig, oppure NetTCP, NetNamedPipe, MSMQ ecc. ecc.) e il Contract l’interfaccia che il WCF deve implementare.

Il bello di WCF, come accennato, è che per cambiare il suo comportamento in senso più esteso, quindi l’indirizzo cui può essere raggiunto, la modalità in cui il servizio espone i suoi metodi ecc. ecc. può essere cambiato a runtime, senza intervento dello sviluppatore semplicemente variando il file di configurazione dell’applicazione, dove tra i tag <System.ServiceModel>…</System.ServiceModel> vengono configurati i vari binding (e non solo…)

 

Parte I: Creazione del WCF

Avviare Visual Studio 2008 e creare un nuovo progetto del tipo “Class Library”, ovvero una semplice libreria DLL. Aggiungiamo un riferimento al componente System.ServiceModel e creiamo un nuovo file C# in cui andremo a dichiarare la nostra interfaccia chiamata IGTService:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace GTService
{
     [ServiceContract]
     interface IGTService
     {
          [OperationContract]
          String getHello();
     }
}

La descrizione dell’interfaccia è ben poca cosa: si “decora” la sua dichiarazione con la parola chiave [ServiceContract], e questo permetterà a WCF di capire che quest’interfaccia è quella del “contratto”, ovvero conterrà la definizione dei metodi che il WCF esporrà. Ogni metodo che dovrà essere esposto dovrà essere segnato come [OperationContract].

A questo punto possiamo aggiungere al progetto un nuovo file C# che conterrà una classe che implementerà l’interfaccia appena creata:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GTService
{
public class GTService : IGTService
{
#region IGTService Members

public string getHello()
{
System.Console.WriteLine("Ho ricevuto una richiesta per \"getHello\"");
return "Hello World!";
}

#endregion
}
}

L’implementazione dell’interfaccia del WCF non ha bisogno di ulteriori commenti: il “cuore” del nostro WCF è così completato.

 

Parte II: applicazione host

Quello che faremo ora è creare un’applicazione che esponga il servizi precedentemente creato: ciò avverrà attraverso la creazione di un’applicazione console. Come anticipato, ben difficilmente nella vita reale andremo ad esporre un WCF attraverso un’applicazione console, probabilmente lo faremo attraverso IIS o in casi più particolari attraverso un servizio di Windows: tuttavia in questo contesto l’applicazione host fa perfettamente il suo dovere e non ci fa perdere tempo si aspetti che esulano dallo scopo di questo breve tutorial.

In Visual Studio 2008 aggiungiamo alla soluzione precedentemente creata un nuovo progetto di tipo “Console Application”: come fatto per la libreria aggiungiamo un riferimento al componente System.ServiceModel ed aggiungiamo al main il codice seguente:

 

using (ServiceHost service = new ServiceHost(typeof(GTService.GTService)))
{
service.Open();

System.Console.WriteLine("Premi  per terminare il servizio");
System.Console.ReadLine();

service.Close();
}

Le operazioni compiute da questo programma sono molto semplici: un’istanza della classe ServiceHost permette di “ospitare” il nostro servizio. La comunicazione verrà aperta invocando il metodo Open. Com’è facilmente intuibile il servizio rimarrà in ascolto fin quando non verrà premuto un tasto ovvero fin quando non verrà invocato il metodo Close.

 

Parte III: Configurazione del servizio

Aggiungiamo alla nostra applicazione host il suo file di configurazione ed editiamolo, aggiungendovi la sezione System.ServiceModel come segue:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="GTService.GTService" behaviorConfiguration="GTServiceBehaviorConfiguration">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8888/GTService.svc"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="GTService.IGTService"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="GTServiceBehaviorConfiguration">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</system.serviceModel>
</configuration>

 

Vediamone velocemente il significato: nella sezione Services vengono aggiunti tutti i servizi esposti dal WCF, nel nostro caso è uno. Ogni tag Service descrive il servizi: gli viene dato un nome (che poi è quello che viene chiamato dal costruttore di ServiceHost) e viene specificato il behaviorConfiguration, ovvero la sezione di App.Config in cui verrà configurato il comportamento del servizio stesso.

Si aggiungono i baseAddress ovvero la base comune a tutti gl’indirizzi dei vari endpoint (per indirizzi s’intende proprio l’indirizzo del servizio).

Si aggiunge un entpoint il cui address è vuoto proprio perché non si vuole aggiungere null’altro al baseAddress, si specifica un binding, in questo caso il basicHttpBindig (assimilabile al vecchio web service .asmx di .Net 2.x e precedenti) e l’interfaccia che definisce il contratto.

Aggiungiamo poi un serviceBehaviors, ovvero un comportamento in cui semplicemente si dice al WCF di pubblicare il WSDL.

A questo punto avviando il servizio ed aprendo con un browser l’indirizzo dell’endpoint possiamo verificare che il tutto venga effettivamente esposto se otterremo qualcosa di simile a quanto visibile a seguito:

 

 

Guardando bene la risposta del browser abbiamo già le istruzioni per creare un semplice client per il nostro servizio, cosa che andremo a fare nella sezione seguente. 

 

Parte IV: creazione dell’applicazione client

Per prima cosa, così come specificato dalla risposta del browser precedentemente ottenuta, dobbiamo generare le classi e il file di configurazione che permetteranno alla nostra applicazione client d’invocare il servizio: apriamo un prompt dei comandi di Visual Studio e digitiamo il comando:

 

svcutil.exe http://localhost:8888/GTService.svc?wsdl

 

al seguito dell’esecuzione di questo comando verranno generati due file: GTService.cs e App.Config. Creiamo una nuova Console Application ed aggiungiamola alla nostra soluzione in Visual Studio ed aggiungiamo questi due file al progetto appena creato.

Editiamo come segue il main della nuova Console Application:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TestClient;

namespace TestClient
{
class Program
{
static void Main(string[] args)
{
using (GTServiceClient client = new GTServiceClient())
{
client.Open();
String str = client.getHello();
client.Close();

System.Console.WriteLine("Messaggio : " + str);
System.Console.ReadKey(true);
}
}
}
}

La descrizione di quanto fatto è molto semplice: nel file GTService.cs è dichiarata una classe GTServiceClient che permette d’iniziare la comunicazione con il servizio e fra le tante altro cose, c’è la dichiarazione al metodo del servizio getHello. Mandando in esecuzione quest’applicazione otterremo l’output su console del messaggio ritornato dal metodo getHello.

Ci sarebbero tantissime altre cose da dire sull’argomento, ma andrebbero fatte in una sede diversa da quella di un tutorial introduttivo come questo.

Pillole di .Net 4.0: JumpiList

18. luglio 2010 12.57

Windows Vista prima e Windows 7 successivamente hanno (finalmente) portato un po’ di rinnovamento alla GUI di Windows che tema dei colori a parte, era rimasta sostanzialmente immutata dai tempi di Windows 95. Lo stesso framework .Net, con l’introduzione di WPF, con la sua versione 3.x, ha portato nuovi strumenti che permettono agli sviluppatori di realizzare applicazioni con interfacce grafiche più accattivanti.

In questo breve tutorial vedremo come, su Windows 7, sfruttare le nuove jumplist della taskbar: le jumplist non sono altro che quelle finestre “baloon” che si aprono al click del tasto destro del mouse cliccando su un’icona della taskbar come mostrato di seguito.

 

 

Gli strumenti utilizzati sono: .Net Framework 4.0 e Visual Studio 2010.

Per prima cosa apriamo Visual Studio 2010 e creiamo un nuovo progetto del tipo “WPF Application” e modifichiamo il target al framework 4.0.

 

A questo punto importiamo il namespace System.Windows.Shell 

using System.Windows.Shell;

 

Siamo ora pronti a creare la nostra JumpList aggiungendo il nostro codice al metodo

 

private void Window_Loaded(object sender, RoutedEventArgs e);

Premessa: quello che andremo a fare è creare un nuovo “gruppo” denominato “Link utili” a cui aggiungeremo un link ad Internet Explorer (che nel mio caso, avendo Windows 7 a 64 bit si troverà al path: “C:\Program Files (x86)\Internet Explorer\iexplore.exe”).

Il come farlo è mostrato di seguito con i commenti che sono più che sufficienti a descrivere le azioni compiute:

 

// Dichiaro l'oggetto JumpTask da aggiungere alla JumpList
JumpTask jumpTask1 = new JumpTask();

// Modifico il comportamento del JumpTask
jumpTask1.ApplicationPath = @"C:\Program Files (x86)\Internet Explorer\iexplore.exe";
jumpTask1.IconResourcePath = @"C:\Program Files (x86)\Internet Explorer\iexplore.exe";
jumpTask1.Title = "Internet Explorer";
jumpTask1.Description = "Apri Internet Explorer.";
jumpTask1.CustomCategory = "Link utili";

// Aggiungo il JumpTask alla JumpList
JumpList jumpList2 = new JumpList();
jumpList2.JumpItems.Add(jumpTask1);

// Aggiungo la JumpList alla nostra applicazione
JumpList.SetJumpList(App.Current, jumpList2);

Lenovo ThinkPad T410i

4. luglio 2010 21.53

Nei giorni scorsi ho cambiato portatile e dopo una scelta durata un mesetto cercando di capire quale potesse fare al mio caso, la scelta è caduta sul Lenovo ThinkPad T410i.

Quello di cui ero alla ricerca era un computer dalle caratteristiche spiccatamente business, molto solido e possibilmente compatto. Altra caratteristica fondamentale: assenza di rumore delle ventole per quanto possibile.

Dovo dire che con questo computer ho centrato perfettamente l’obiettivo che mi ero preposto, anche a fronte del caldo infernale che in questi giorni sta attanagliando Roma, il rumore generato dalle ventole è più che sopportabile.

Rispetto alla configurazione originale ho cambiato il disco, sostituendo l’originale da 250gb da 5400rpm con un nuovo da 500gb da 7200rpm: il cambio è stato estremamente agevole visto che è stato sufficiente rimuovere una vite e poi sfilare l’apposito bay; questo cambio mi ha permesso d’ammirare la cura con cui questo computer è stato costruito: il disco è “circondato” da una griglia di protezione ai cui lati è presente una guarnizione di gomma per assorbire evidentemente urti e vibrazioni. In prospettiva quello che vorrei fare è portare la RAM a 8Gb: il primo slot è facilmente accessibile nella parte inferiore del computer, il sencondo purtroppo è invece piazzato sotto la tastiera e richiede un po’ di lavoro per essere “scoperto”.

Il sistema operativo fornito a corredo, ovviamente originale, è Windows 7 Professional a 64 bit. Presenti anche innumerevoli utilità di sistema per il monitoraggio e la gestione dell’hardware (forse un po’ più invasivi di quelli forniti quando i ThinkPad erano prodotti da IBM) e WinDVD.

Al momento non posso che dare un giudizio ampiamente positivo a questa splendida macchina che dovrebbe accompagnarmi in lavoro, studio e svago nei prossimi due anni.

Software iPhone al Forum PA 2010

17. maggio 2010 12.51

Oggi è iniziato il Forum PA: la manifestazione dedicata al mondo della Pubblica Amministrazione. Quest’anno ho avuto il piacere di collaborare con un nostro importante cliente per la realizzazione di tre applicazioni per iPhone da presentare appunto al Forum PA: INPS, INPS Ufficio Stampa e INAIL Punto Cliente.

Ora non voglio andare in dettaglio a queste tre app, il forum è ancora in corso e v’invito quindi a visitarlo. Il piacere è non solo aver lavorato duramente ma con estrema soddisfazione ma anche il poter vedere con mano l’interesse del pubblico presso lo stand d'esposizione.

Nuova certificazione Microsoft TS 70-503: Microsoft .NET Framework – Windows Communication Foundation!

6. maggio 2010 21.50

Questa mattina ho sostenuto l’esame 70-503: Microsoft .NET Framework 3.5 – Windows Communication Foundation e sono quindi diventato un MCTS. Avrei voluto dedicare più tempo allo studio ma il grande impegno lavorativo su più fronti mi ha impedito ciò: nonostante questo però sono riuscito o a superare senza sforzo anche quest’ostacolo.

Un anno in Nexse

7. aprile 2010 12.50

Ieri è stato il mio primo anniversario in Nexse, l’azienda della quale sono orgoglioso dipendente: vorrei ringraziare tutti coloro che hanno reso possibile questa splendida esperienza in primis Stefano, Simona e Leonardo!

Microsoft TS 70-536: Microsoft .NET Framework – Missione compiuta

31. marzo 2010 21.49

Come da titolo: missione compiuta. Questa mattina ho sostenuto l’esame di “certificazione” ottenendo l’ottimo punteggio di 953/1000. Sono estremamente soddisfatto per l’ottima performance e grato alla mia azienda, la Nexse Technology, per l’opportunità che mi è stata data: è stato un piacere ricambiare nel miglior modo possibile la fiducia.

Per quanto riguarda l’esame in se posso solo dire che studiare sul testo fornito dalla Microsoft stessa aiuta certamente ed una buona pratica permette poi di superare agevolmente le difficoltà. L’esame è comunque piuttosto “teorico”: spesso s’incontrano domande in cui più risposte sono corrette (e magari noi avremmo fatto come una di quelle) ma che in realtà sono meno “preferibili” rispetto all’unica giusta.

Per quanto mi riguarda, il punteggio significa 2 risposte errate, tra l’altro su argomenti “configurazione” e “serializzazione” … sono rimasto un po’ sorpreso, probabilmente avessi letto con più attenzione le domande sarei riuscito a centrare il 1000/1000 cosa che ultimamente facevo abbastanza abitualmente tramite il software di test, ma va bene ugualmente così.

Ora posso dedicarmi con serenità a preparare l’altro esame, il 70-503, ovvero Windows Communication Foundation.

Certificazione 70-536 Microsoft .NET Framework – Application Development Foundation

30. gennaio 2010 11.12

Grazie a Nexse, ieri sera ho iniziato a seguire il corso per la certificazione 70-536 “Microsoft .Net Framework – Applicazione Development Foundation”. A fronte di tanti anni di lavoro una certificazione, che sebbene ai fini pratici professionalmente parlando nel mercato in cui opero non cambia tantissimo, è un attestato che, se l’esame finale andrà bene, avrò un gran piacere ad esporre.

Info su di me

Il mio nome è Gennaro Eduardo Tangari e sono uno sviluppatore certificato su tecnologie Microsoft .NET che lavora prevalentemente su applicazioni web enterprise e mobile.

Attualmente lavoro presso Value Team S.p.A. con la qualifica di Senior Consultant su progetti internazionali e nazionali basati su tecnologie Microsoft, con particolare cura verso Microsoft Dynamics CRM.

Questo blog nasce dall'esigenza di condividere esperienze e metodologie acquisite durante gli anni di lavoro cercando di restituire alla rete quello che la rete stessa mi ha dato: informazioni utili.

 

Certificazione

 

 

QRCode