Certificazioni Microsoft sul Framework .NET 4.0 e Visual Studio 2010

Visual-Studio-2010-CertificationPathFinalmente! La lunga attesa è finita... dal 2 luglio è possibile sostenere gli esami per le certificazioni Microsoft sul Framework .NET 4.0 e Visual Studio 2010.

In tutto ci sono 4 esami base su Windows, Web, Service e Data Access ognuno dei quali dà diritto alla certificazione Microsoft Certified Technology Specialist (MCTS) e successivamente altri due di livello "PRO" per ottenere la certificazione Microsoft Certified Professional Developer (MCPD) su Windows e Web.

Sono inoltre disponibili gli upgrade per chi ha già una certificazione...

 

 

Nel dettaglio gli esami sono i seguenti:

  • Exam 70-511: TS: Windows Applications Development with Microsoft .NET Framework 4
  • Exam 70-515: TS: Web Applications Development with Microsoft .NET Framework 4
  • Exam 70-513: TS: Windows Communication Foundation Development with Microsoft .NET Framework 4
  • Exam 70-516: TS: Accessing Data with Microsoft .NET Framework 4
  • Exam 70-518: PRO: Designing and Developing Windows Applications Using Microsoft .NET Framework 4
  • Exam 70-519: PRO: Designing and Developing Web Applications Using Microsoft .NET Framework 4

...e adesso tutti a studiare e in bocca al lupo!


Chiudere il tag img con una regular expression in C#

Rispetto al vecchio html, il linguaggio xhtml richiede che tutti tag siano chiusi. Capita a volte utilizzando degli editor hml che questa regola non venga applicata alle immagini. Ecco allora come possiamo, attraverso una semplice regular expression, chiudere automaticamente il tag img:

Regex r = new Regex("]*[^/](>)", RegexOptions.IgnoreCase);
source = r.Replace(source, 
     new MatchEvaluator(m => m.ToString().Replace(m.Groups[1].ToString(), " />")));

Trim di un array di stringhe con una sola riga di codice

L'altro giorno stavo cercando un modo veloce per eseguire il "Trim" degli elementi di un array di stringhe. Analizzando la classe Array mi sono imbattuto nel metodo Array.ForEach. Questo metodo sembrava proprio fare al caso mio, in quanto permette di eseguire una Action per ogni elemento dell'array, purtroppo però come il classico foreach non permette di modificare gli elementi dell'insieme che stiamo scorrendo.
Sicuro di trovare all'interno della classe Array la soluzione al mio problema ho continuato a cercare fino alla scoperta del metodo Array.ConvertAll. Questo metodo esegue la conversione di tipo fra array permettendo di specificare come parametro la funzione di conversione. Forse non l'ho utilizzato per il motivo per cui è stato sviluppato, ma in definitiva mi ha permesso di ottenere lo scopo con una sola riga di codice (04-06):

string[] myArray = new string[]{ " 23", " 45", " 67 "};
Array.ForEach(myArray, s => Console.Write(s));
// risultato: 23 45 67
myArray = Array.ConvertAll(myArray, 
                               new Converter(s => s.Trim()));
Array.ForEach(myArray, s => Console.Write(s));
// risultato: 234567

Mappare MonoRail su ASP.NET MVC 2.0

Nel mio viaggio da MonoRail ad ASP.NET MVC 2.0 mi è capitato di dover gestire una serie di link esterni che richiamavano pagine del sito sui quali non avevo controllo e che ovviamente utilizzavano l'estensione ".rails" tipica di MonoRail. Visto che i nomi di controller ed action erano rimasti comunque invariati ho pensato di utilizzare il sistema di routing di ASP.NET.

Una delle caratteristiche più interessanti del routing di ASP.NET è la possibilità di specificare dei constraint nella registrazione di una route attraverso implementazione di IRouteConstraint. Il ruolo del constraint è quello di definire la validità della regola per la richiesta corrente. Il primo passo da compiere sarà quindi quello di definire un constraint che ci permetta di escludere dai nostri routing le richieste con estensione ".rails". Qui sotto possiamo vedere nel dettaglio il codice:

public class NotContainsRouteConstraint : IRouteConstraint
{
  private string _value;

  public NotContainsRouteConstraint(string value)
  {
    _value = value;
  }

  public bool Match(HttpContextBase httpContext, 
                    Route route, 
                    string parameterName, 
                    RouteValueDictionary values, 
                    RouteDirection routeDirection)
  {
    var paramValue = values[parameterName].ToString();
    return !paramValue.Contains(_value);
  }
}

Nel metodo di registrazione delle regole di routing nel Global.asax aggiungiamo alle regola già configurate la constraint per le action che contengono la stringa ".rails" e definiamo una nuova regola che invece le consideri. Qui sotto possiamo vedere un esempio di configurazione, attenzione però che se abbiamo ulteriori regole dobbiamo valutare di volta in volta se aggiungere il constraint in base al fatto che queste regole eseguano il match con le chiamate alle pagine di MonoRail.

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  routes.IgnoreRoute("favicon.ico");

  routes.MapRoute(
   "Default",
   "{controller}/{action}/{id}",
   new {controller="Home", action="Index", id=UrlParameter.Optional},
   new {action = new NotContainsRouteConstraint(".rails")}
  );
  routes.MapRoute(
   ".rails",
   "{controller}/{action}.rails",
   new {controller="Home", action="Index", id=UrlParameter.Optional}
  );
  routes.MapRoute(
   "Root",
   "",
   new {controller="Home", action="Index", id=UrlParameter.Optional}
  );
}

ASP.NET MVC: Passaggio di parametri ad una action tramite RouteData

Immaginiamo di voler chiamare una action di un controller ASP.NET MVC passando una serie di parametri. Normalmente attraverso la chiamata a RedirectToAction utilizziamo un anonymous type, ma la precondizione è di conoscere il nome dei parametri da passare.
Nel caso in oggetto però noi non conosciamo a priori il nome dei parametri, come possiamo fare? In questa circostanza possiamo utilizzare la proprietà RouteData della classe Controller e precisamente la sua proprietà Values, un dizionario che contiene tutti i valori della richiesta:

//parameters è la collezione che contiene i parametri da passare
foreach(var key in parameters.AllKeys)
{
   RouteData.Values.Add(key, parameters[key]);
}
return RedirectToAction("[action]", "[controller]", RouteData.Values);

Come eseguire una stored procedure con Entity Framework 4.0

Ecco come chiamare una stored procedure con Entity Framework 4.0, il codice è preso dalla presentazione fatta all'ultimo evento di 1nn0va:

// Chiama la stored usp_Authenticate passando username e password
var db = new BlogEntities();
var user = db.ExecuteStoreQuery("exec usp_Authenticate {0},{1}",
           username, password);

Web Congress 3.0: Entity Framework 4.0 vs NHibernate, slide e codice

webcongressVenerdì 16 aprile si è svolto a Pordenone l'evento più importante dell'anno organizzato da 1nn0va sulle tecnologie web.
Quest'anno ho avuto l'onore di farne parte come speaker presentando una sessione sull'accesso ai dati via ORM (Object-Relational Mapping) in un paragone tra il veterano NHibernate ed il promettente Entity Framework 4.0 di Microsoft.

Devo dire che Microsoft ha fatto un gran lavoro per colmare il gap che esisteva tra la prima versione dell'Entity Framework e gli altri protagonisti del settore. Una delle caratteristiche più apprezzate della nuova release è la possibilità ora concreta di utilizzare le proprie classi di dominio senza dover necessariamente ereditare dalla classe base EntityObject. La cosa si fa poi ancora più interessante se sfruttiamo il nuovo sistema di template (T4) che ci permette di generare automaticamente dall'Entity Data model (EDM) le classi di dominio in "modalità" POCO (Plain Old CLR Object).

Per chi fosse interessato in fondo al post trova i link per scaricare le slide e la solution di Visual Studio 2010 con tutto il codice sorgente.

L'applicazione di esempio è un semplice blog engine sviluppato in ASP.NET MVC 2.0 con l'obiettivo di separare per quanto possibile la logica di business dalla presentation e dall'accesso ai dati.

solution L'architettura è a quattro livelli ed in particolare:

  • SampleBlog.Web: progetto di tipo ASP.NET MVC 2.0 ovvero il livello di presentazione dei dati
  • SampleBlog.Model: progetto che astrae la parte Model dell'MVC per slegare la logica di dominio dalla presentazione e che contiene le nostre classi POCO
  • SampleBlog.AppServices un Service-Layer che qui gioca un po' il ruolo del Repository
  • SampleBlog.CommonPersistence: uno dei tre livelli di persistenza, utilizza ADO.NET "Legacy" quindi SqlCommand, SqlDataReader e stored procedure
  • SampleBlog.NHibernatePersistence: utilizza NHibernate e un mapping su file xml
  • SampleBlog.EntityFrameworkPersistence: utilizza Entity Framework però in versione "Persistence Ignorance", ovvero mappato sulle classi POCO del nostro modello

Il tutto condito con Windsor il framework IoC di Castle Project che permette di scegliere di volta in volta quale progetto di persistenza usare.

Ricordo comunque che l'applicazione è stata realizzata esclusivamente con l'ottica di mostrare l'accesso ai dati tramite Entity Framework ed NHibernate in contrapposizione a quello che normalmente si fa con ADO.NET "Classic", non prendetela quindi come esempio di architettura a quattro livelli.

Slide e codice dell'evento disponibili per il download:


Distinct con LINQ

Se vogliamo ottenere con LINQ una lista di elementi senza duplicati possiamo utilizzare il metodo Distinct<T>() dell'interfaccia IEnumerable<T> nel seguente modo:

// Prendo da un array di nomi solo quelli che cominciano con M
string[] names = new string[]{ "Andrea", "Marco", "Manuel", "Marco", 
                               "Sara", "Elisa", "Marta" };
var distinctNames = (from name in names
                    where name.StartsWith("M")
                    select name).Distinct();

Importare i preferiti del Nokia E72 in Internet Explorer

Devo dire onestamente che il Nokia E72 ha rappresentato per me una grande rivoluzione nell'utilizzo di internet e nel modo di tenermi aggiornato sulle novità della programmazione e non solo. Con l'aiuto di Google Reader ora leggo comodamente i miei feed durante la giornata e salvo tra i preferiti le notizie più interessanti. Rimane da risolvere la scomodità di consultare poi le notizie salvate sul piccolo schermo... Da qui l'idea di realizzare un'applicazione che converta i preferiti salvati nel cellulare Nokia nei preferiti di Internet Explorer. Un'oretta e 50 righe di codice dopo ecco risolto brillantemente il problema!

Come procedere...

Per prima cosa è necessario configurare l'applicazione tramite gli appSettings del file App.config specificando nell'ordine la cartella di backup del cellulare, il nome della cartella nei preferiti di ie, la cartella dove salvare i bookmark del browser ed infine il nome del file che conterrà i bookmark.



  
   
   
   
   
  

Successivamente è necessario creare un backup del cellulare contenente solo i preferiti con la Nokia PC Suite salvando poi il file nella cartella precedentemente impostata nel file di configurazione.

nokia-backup
 

Poi bisogna eseguire il programma (vedi figura sottostante) cliccare su browse..., selezionare il file di backup e cliccare su Load.

nokia-favorites
 

A questo punto nella cartella che abbiamo impostato come destinazione dei preferiti troveremo il file con i bookmark da importare nel nostro browser.

Il programma lo potete scaricare da qui.

Nota: l'applicazione è stata realizzata per il modello E72 ma potrebbe essere utilizzata anche con altri modelli delle serie E ed N purché condividano lo stesso formato di backup.


Configurare il database di BlogEngine.NET su Aruba

BlogEngine.NET viene distribuito con uno script di configurazione per creare il database su SQLServer con tabelle e dati di esempio. Come tutti oramai sanno Aruba utilizza uno schema diverso da dbo con nome uguale al nome del database per questo motivo è necessario creare nel db lo schema e poi inserire con un trova-sostituisci tale nome nello script di configurazione. A questo punto è però necessario dire al core di BlogEngine.NET di utilizzare il nuovo schema. BlogEngine.NET utilizza il prefisso "be_" per le tabelle del db, tale valore è modificabile da web.config e noi lo modificheremo in modo da aggiungere lo schema (MsSql00001 ad esempio):