June 2009 Blog Posts
Cosa bolle in pentola…

Su CodeProject questa settimana sono stati pubblicati o ripubblicati diversi articoli interessanti. La qualità del codice e delle persone che lo scrivono aumenta e si vede sempre di più. L’informatica continua a fare grandi passi avanti! Qualche anno fa non era così allettante leggere una news letter di qualche portale di sviluppo.

Comunque, secondo il mio ordine di rilevanza:
1. AutoDiagrammer: un tool per creare il class diagram dato l’assembly .NET; non avuto modo di vedere il codice sorgente, che sembra non esserci se non decompilando la library, ma all’interno si trova anche una classe che permette di capire se il file è un assembly .NET leggendone l’intestazione, domanda che leggo frequentemente
2. Generic cross thread per Windows Forms: un metodo per fare chiamate cross-thread usando Control.Invoke per eseguire il codice nel main thread dell’applicazione Windows; nota: è meglio convertire il metodo in un extension method ;-)
3. MVVM Dialogs: come risolvere il problema di visulizzare dialog box modali “sporcando” il pattern, argomento caldo visto che l’ha trattato anche Mauro ieri alla conference UGI Alt
4. Code browser take 2 Silverlight: un browser di codice via AJAX con syntax highlighter o via Silverlight
5. Permutations: calcolo delle permutazioni semplici, altra richiesta frequente

Il mio viaggio verso cit. “la Mecca delle architetture” continua…

Matteo Migliore.

Migrazione a Visual Studio 2010 B1 e al Framework 4: ahi ahi che dolor

Nella mia società stiamo facendo la migrazione di tutte le applicazioni core al FW 4.0, ovviamente non senza sorprese. Sto lavorando su una solution di esempio che pubblicherò a breve per testare Entity Framework v2 o v4 (mah :-) ) in modalità Model First: spettacolo; e su altre tipo Silverlight 3 come Navigation Application.

A proposito di Navigation Application, in VS2010 B1 a me non compare il template.

La soluzione sarebbe quella di reinstallare l’SDK di Silverlight 2, l’SDK Silverlight 3 e il Developer Runtime, a me non funziona; poco male perchè è sufficiente aggiungere le reference alle library:
1. System.Windows.Browser
2. System.Windows.Controls.Navigation

Arrivando a WCF 4.0, almeno credo proprio che il problema sia quello, non riuscivo a creare la reference al servizio ottenendo questo errore:
Metadata publishing for this service is currently disabled.

Certo cercare su Google è bello, ma far cercare ad altri, in particolare il buon Ale, è meglio. Per il momento la soluzione è questa:
------------------------------------------------------------
ServiceHostBase host = OperationContext.Current.Host;

ServiceMetadataBehavior serviceMetadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();

if (serviceMetadataBehavior == null)
{

    serviceMetadataBehavior = new ServiceMetadataBehavior();
    serviceMetadataBehavior.HttpGetEnabled = true;

    serviceMetadataBehavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    host.Description.Behaviors.Add(serviceMetadataBehavior);

    host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
}
------------------------------------------------------------

L’avventura continua…

Matteo Migliore.

[OT] Verso la Croazia…

Cosa vogliamo dire di questo benedetto omino qua? :-D

Altre foto non posso pubblicarle causa censura (non sono foto di Lorenzo… :D).

Matteo Migliore.

Iterazione e azione ricorsiva su una collection gerarchica

Da una richiesta sul news group di ASP.NET riporto questi due extension method che ho scritto per iterare ricorsivamente su una collection in modo gerarchico ed effettuare un’azione, nel caso specifico è stato chiesto come cancellare tutte le TextBox di una pagina senza doverlo fare manualmente su ognuna:
-------------------------------------------------------- 
public static class ControlExtension
{
    public static void DoActionForAllChildren<T>(this Control container, Action<T> action)
    {
        container.Controls
            .OfType<Control>()
            .Traverse(control => control.Controls.OfType<Control>())
            .Where(control => control.GetType() == typeof(T))
            .Cast<T>()
            .ForEach(action);
    }
}

public static class EnumerableHierarchicalExtension
{
    public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> recursion)
    {
        foreach (T item in source)
        {

            yield return item;

            IEnumerable<T> recursionSequence = recursion(item);

            if (recursionSequence != null)
            {

                foreach (T itemRecurse in Traverse(recursionSequence, recursion))
                {

                    yield return itemRecurse;
                }
            }
        }
    }

    public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
    {
        foreach (var item in source)
        {
            action(item);
        }
    }
}
--------------------------------------------------------

Quindi la chiamata diventa:
--------------------------------------------------------
this.DoActionForAllChildren<TextBox>(action => action.Text = string.Empty);
--------------------------------------------------------

[Update]
Codice leggermente riadattato secondo il consiglio di Stefano.

Matteo Migliore.

[OT] Evento Microsoft in Croazia con Lorenzo

Si parte ora, per un evento Microsoft in Croazia con Lorenzo. Figata! 9 ore di viaggio!!

Matteo Migliore.

Windows 7 senza browser

Una fonte “non citabile” mi ha segnalato questa notizia:
http://microsoftontheissues.com/cs/blogs/mscorp/archive/2009/06/11/working-to-fulfill-our-legal-obligations-in-europe-for-windows-7.aspx

Windows 7 in Europa per i soliti problemi di antitrust dovrà essere installato senza Internet Explorer, poco male, come ho detto “alla fonte”, il pluralismo va bene in ogni caso, se Microsoft detiene de facto il monopolio c’è poco da arrabbiarsi, un ostacolo per gli utenti medi e una “vittoria” per chi riteneva Windows illecito per questo motivo.

Matteo Migliore.

2 GB di spazio ed un estensione per Explorer

Segnalo quest’applicazione che è un estensione di Explorer per gestire file su un repository remoto accessibile via HTTP. Una volta copiato il file basta fare click con il tasto destro e copiare il link pubblico. Utile per noi blogger :-) e per gestire file online in generale:

Matteo Migliore.

Convertire un progetto da VS2008 a VS2010 Beta1

Se si prova ad aprire una solution di Visual Studio 2008 SP1 con la Beta 1 di Visual Studio 2010 dopo la conversione provando a compilare si ottiene l’errore segnalato qui:
error MSB3259: Invalid parameter combination. Can only set either subset or profile parameters. Cannot set one or more subset parameters ("TargetFrameworkSubset", "InstalledAssemblySubsetTables") and one or more profile parameters ("ProfileName", "FullFrameworkFolders","FullFrameworkAssemblyTables") as the same time.

Su Connect hanno risposto che il problema verrà risolto con la Beta 2, nel frattempo è sufficiente aprire il file di progetto con un editor di testo e rimuovere le righe che si trovano nel nodo “<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>”:
<TargetFrameworkSubset>Full</TargetFrameworkSubset>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>3.5</OldToolsVersion>
<UpgradeBackupLocation />
<TargetFrameworkProfile>Client</TargetFrameworkProfile>

Matteo Migliore.

CodeContracts disponibili per Visual Studio 2008


Qui si trova il progetto di Microsoft Research che mette a disposizione i Code Contracts anche per Visual Studio 2008, sia Express che VSTS. Per la versione Express non è disponibile lo Static Checking, quindi niente errori a compile time su violazione dei contratti:
Microsoft Research: Code Contracts
http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx

Have nice coding :-).

Matteo Migliore.

[PostIt] Clonare una Bitmap senza lock


Riporto questo snippet nella “nuova categoria” PostIt, per averlo sempre a disposizione:
----------------------------------------------------
private Bitmap SafetyCloneBitmap(string filePath)
{
    Bitmap cloned;
    using (Bitmap bitmap = new Bitmap(filePath))
    {
        cloned = new Bitmap(bitmap.Width, bitmap.Height);
        using (Graphics graphics = Graphics.FromImage(cloned))
        {
            graphics.DrawImage(bitmap, 0, 0);
        }
    }
    return cloned;
}
----------------------------------------------------

Che la Clone della Bitmap sia implementata male? Perche tutto questo giro per clonarla??

Matteo Migliore,

Add Comment Filed Under [ PostIt ]
Parametri opzionali e valori di default con C# 4.0


Riporto dal blog di David Hayden la nuova feature di C# 4.0 relativa alla possibilità di specificare dei valori di default per i parametri di un metodo, questo consente di scrivere meno codice, meno overload e quindi limitare gli errori ;-).

Qui l’articolo.

Matteo Migliore.

POCO con EF v. 1.0


Segnalo questa library per scrivere codice in stile POCO con Entity Framework 1.0, per chi ancora non può passare alla Beta del Framework 4.0:
http://code.msdn.microsoft.com/EFPocoAdapter.

Si tratta di un generatore di codice, che non ho ancora avuto modo di provare, Entity Framework 1.0 l’ho adottato AS-IS, non mi sono proprio posto il problema di scrivere un DAL astratto utilizzandolo, i miei Domain sono legati a doppia mandata con EF 1.0, non avevo tempo di wrappare tutto e scrivere tonnellate di codice :-).

Ciò che promette/permette di fare:

  • Change tracking (snapshot-based and proxy-based when possible)
  • Transparent lazy loading
  • Immutable Value Objects
  • Queries (LINQ and Entity SQL)
  • Shadow state (maintaining certain persistence-related fields outside of entity class)


Con EF v 2.0 sto iniziando a fare dei test seri per fare la migrazione di *tutto* il “vecchio” codice.

Il Service Layer con gli adaptor da entity a contract e vice-versa rende meno pesante il problema di avere un Domain POCO, ma certamente questo vincolo ha influito molto sul modo in cui ho scritto i layer in questi ultimi mesi.

Vediamo come cambieranno le cose, anche se come fa giustamente notare Stefano, il percorso è ancora lungo, non ho avuto modo di testare il Lazy Loading ma probabilmente ciò che dice Oren Eini (AKA Ayende) è vero, senza proprietà virtual il lazy loading non è possibile allo stesso modo in cui è implementato da NHibernate con Castle Dynamic Proxy.

Matteo Migliore.

Entity Framework 4.0


Le versioni dalla 1.0 alla 4.0 sono saltate? :-)

Qui è riassunot il lavoro meritorio del team di EF, questi due post rimmarranno nella storia:
New features in Entity Framework 4.0 v2
MSDN: POCO in the Entity Framework - Part 1: the experience
MSDN: POCO in the Entity Framework - Part 2: complex types deferred loading and explicit loading

Leggere di POCO, pattern Repository, Unit Of Work e Lazy Loading relativamente ad EF mi ha fatto venire un brivido:


Matteo Migliore.