<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>IEnumerable - Il blog personale di Andrea Balducci</title><link>http://www.ienumerable.it/</link><description>IEnumerable.it</description><copyright>Andrea Balducci - IEnumerable.it</copyright><docs>http://www.rssboard.org/rss-specification</docs><generator>http://www.tostring.it/about/dexter</generator><language>en-US</language><lastBuildDate>Mon, 25 Jul 2011 09:15:04 GMT</lastBuildDate><webMaster>admin</webMaster><category>IEnumerable c# NHibernate aspnet mvc aspnetmvc dotnetmarche ugialt.net</category><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ienumerable" /><feedburner:info uri="ienumerable" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Libero professionista vs Dipendente</title><description>&lt;p&gt;Le statistiche di &lt;a href="http://www.xobni.com/"&gt;xobni&lt;/a&gt; offrono interessanti spunti di riflessione. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_2_2.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_6.png" width="244" height="45" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_4_2.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_1_2.png" width="244" height="47" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_6_2.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_2_2.png" width="244" height="48" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_8.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_3_1.png" width="244" height="47" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_10_1.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_4_1.png" width="244" height="45" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Q: Quanti sono i dipendenti?&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/pz4huMApGEM/libero-professionista-vs-dipendente</link><author>admin</author><comments>http://www.ienumerable.it/blog/post/libero-professionista-vs-dipendente#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/libero-professionista-vs-dipendente</guid><pubDate>Mon, 25 Jul 2011 07:15:04 GMT</pubDate><feedburner:origLink>http://www.ienumerable.it/blog/post/libero-professionista-vs-dipendente</feedburner:origLink></item><item><title>Sviluppare per Windows Mobile su Windows7</title><description>&lt;p&gt;L’emulatore di Windows Mobile richiede per la connettività di rete la presenza del driver distribuito con Virtual PC 2007&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_2_1.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_3.png" width="442" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per poter abilitare la rete senza dover installare il driver basta abilitare la connesione DMA con l’emulatore.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_4_1.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_1_1.png" width="440" height="329" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Da device emulator manager selezionare l’opzione cradle&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_6_1.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_2_1.png" width="373" height="422" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A questo punto l’emulatore si connette al pc&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_10.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_4.png" width="323" height="501" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ora la macchina di sviluppo è raggiungibile&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_12.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_5.png" width="324" height="509" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nota: il Mobile Device Center non è troppo smart.. a volte bisogna cambiare la connessione ad usb, confermare e rimetterla a DMA per “fargli sentire” il device.. con le buone ;D&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/6LMW1HDMQmE/sviluppare-per-windows-mobile-su-windows7</link><author>admin</author><comments>http://www.ienumerable.it/blog/post/sviluppare-per-windows-mobile-su-windows7#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/sviluppare-per-windows-mobile-su-windows7</guid><pubDate>Thu, 26 May 2011 08:51:13 GMT</pubDate><category>Emulator</category><category>Mobile</category><category>Wm6</category><feedburner:origLink>http://www.ienumerable.it/blog/post/sviluppare-per-windows-mobile-su-windows7</feedburner:origLink></item><item><title>Deploy di Orchard su Azure</title><description>&lt;p&gt;Sto testando &lt;a href="http://www.orchardproject.net/"&gt;Orchard&lt;/a&gt; su &lt;a href="http://www.microsoft.com/windowsazure/"&gt;Azure&lt;/a&gt; usando l’abbonamento “&lt;a href="http://msdn.microsoft.com/en-us/subscriptions/ee461076.aspx"&gt;benefit&lt;/a&gt;” di MSDN Premium per un &lt;a href="http://ock.codeplex.com/"&gt;nuovo progetto community&lt;/a&gt;. Nei sorgenti di &lt;a href="http://www.orchardproject.net/"&gt;Orchard&lt;/a&gt; non è indicato il tipo di &lt;a href="http://msdn.microsoft.com/en-us/library/ee814754.aspx"&gt;dimensione della vm&lt;/a&gt;, quindi il buon azure opta per la “small” che ha un costo maggiore di quella inserita nei benefit di MSDN.&lt;/p&gt;  &lt;p&gt;Per verificare che tipo di vm state usando basta abilitare l’apposita colonna “Size” nella maschera degli hosted services&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_2.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb.png" width="672" height="232" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Qualora la dimensione dell’istanza non sia conforme con quanto previsto dai benefit MSDN vi troverete addebitato un costo orario differente; in realtà verranno scalate meno ore di quelle effettivamente consumate perché queste “pesano” meno (to be verified)&lt;/p&gt;  &lt;p&gt;Per modificare la dimensione della vm bisogna agire sulle proprietà del progetto&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_4.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_1.png" width="690" height="407" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;o modificare direttamente il file ServiceDefinition.csdef&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/image_6.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/admin/image_thumb_2.png" width="693" height="408" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Buon test a tutti &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Open-mouthed smile" src="http://www.ienumerable.it/UserFiles/admin/wlEmoticon-openmouthedsmile_2.png" /&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/t4ticjqLaqY/deploy-di-orchard-su-azure</link><author>admin</author><comments>http://www.ienumerable.it/blog/post/deploy-di-orchard-su-azure#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/deploy-di-orchard-su-azure</guid><pubDate>Wed, 11 May 2011 09:49:18 GMT</pubDate><category>Azure orchard mvc msdn</category><feedburner:origLink>http://www.ienumerable.it/blog/post/deploy-di-orchard-su-azure</feedburner:origLink></item><item><title>La strana storia di Quartz, Castle ed NHibernateFacility nel mondo di Lucilla</title><description>&lt;p&gt;C’era una volta una applicazione web che aveva in cui i servizi di business logic si godevano beati il loro lifestyle PerWebRequest… finchè un giorno irruppe il prode cavaliere oscuro pronto a prestare i suoi servizi in background… e a scombinare il regno di Lucilla mettendo in crisi i servizi resi orfani del fido custone in HttpContext che teneva gelosamente la session al sicuro…&lt;/p&gt;  &lt;p&gt;Panico nel Castello… ed ora che si fa? Calma e gesso disse il re (e chi sarà mai questo re? ;D).. che i servizi cambino stile di vita e diventino Transient(i)! &lt;/p&gt;  &lt;p&gt;oohhhhh (questo è vs dopo l’estenuante modifica di 1 parametro nel regno di Lucilla)&lt;/p&gt;  &lt;p&gt;Ora il prode Quartz era pronto a sfoderare tutta la sua potenza schierando nelle seconde file i servizi di supporto e le attività pianificate. Ma ecco che allo scoccare della mezzanotte il primo cavaliere cade sconfitto: il custode della session non c’e’ più, è rimasto prigioniero nelle segrete dell’HttpContext.&lt;/p&gt;  &lt;p&gt;Panico nel castello… la signora facility giace nel letto di HttpContext e non può soddisfare contemporaneamente anche il CallContext… HttpContext o CallContext, IsWeb=true o IsWeb=False? (&lt;a href="http://stw.castleproject.org/Windsor.NHibernate-Facility.ashx"&gt;http://stw.castleproject.org/Windsor.NHibernate-Facility.ashx&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;“IsWeb ‘sta cippa” tuonò il re.. “Facility fa quello che dico io. Si costruisca una nuova stanza per ospitare sia HttpContext che CallContext e che Facility sia sempre pronta a svegliare il custode della session appropriato”…&lt;/p&gt;  &lt;p&gt;E tutti vissero felici e contenti.. &lt;a href="https://gist.github.com/775282"&gt;https://gist.github.com/775282&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Intepreti in ordine sparso..   &lt;br /&gt;Il re : io me medesimo    &lt;br /&gt;Il regno di Lucilla: Lucilla.Framework    &lt;br /&gt;Facility: &lt;a href="http://stw.castleproject.org/Windsor.NHibernate-Facility.ashx"&gt;http://stw.castleproject.org/Windsor.NHibernate-Facility.ashx&lt;/a&gt;    &lt;br /&gt;Il custode in HttpContext: Castle.Facilities.NHibernateIntegration.SessionStores.WebSessionStore    &lt;br /&gt;Il custode in CallContext: Castle.Facilities.NHibernateIntegration.SessionStores.CallContextSessionStore    &lt;br /&gt;Il cavaliere oscuro: &lt;a href="http://quartznet.sourceforge.net/"&gt;http://quartznet.sourceforge.net/&lt;/a&gt;    &lt;br /&gt;La nuova stanza dei custodi: Lucilla.Framework.Core.Data.NHFacility.LucillaSessionStore    &lt;br /&gt;Tempo di realizzazione: 1/10 di quello impiegato a scrivere questo post.. possibile solo nel regno dell’opensource.    &lt;/p&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/SiNDylcaTU0/la-strana-storia-di-quartz-castle-ed-nhibernatefacility-nel-mondo-di-lucilla</link><author>admin</author><comments>http://www.ienumerable.it/blog/post/la-strana-storia-di-quartz-castle-ed-nhibernatefacility-nel-mondo-di-lucilla#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/la-strana-storia-di-quartz-castle-ed-nhibernatefacility-nel-mondo-di-lucilla</guid><pubDate>Tue, 11 Jan 2011 23:08:59 GMT</pubDate><category>Background</category><category>Castle</category><category>Lucilla</category><category>NHibernate</category><category>Quartz.Net</category><category>Session</category><feedburner:origLink>http://www.ienumerable.it/blog/post/la-strana-storia-di-quartz-castle-ed-nhibernatefacility-nel-mondo-di-lucilla</feedburner:origLink></item><item><title>Convertire in automatico il testo con MVC2</title><description>&lt;p&gt;Per un applicativo intranet ho la necessità di vincolare il case di alcuni campi del model. Dopo qualche ricerca in google e nessuna fonte ho creato (non senza qualche dubbio architetturale) una prima implementazione quick &amp;amp; dirty.&lt;/p&gt;  &lt;p&gt;Trovate il codice qui: &lt;a title="https://gist.github.com/773608" href="https://gist.github.com/773608"&gt;https://gist.github.com/773608&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/Cj6AxUuOFgQ/convertire-in-automatico-il-testo-con-mvc2</link><author>admin</author><comments>http://www.ienumerable.it/blog/post/convertire-in-automatico-il-testo-con-mvc2#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/convertire-in-automatico-il-testo-con-mvc2</guid><pubDate>Mon, 10 Jan 2011 22:44:35 GMT</pubDate><category>Aspnetmvc</category><category>Lucilla</category><category>Modelbider</category><feedburner:origLink>http://www.ienumerable.it/blog/post/convertire-in-automatico-il-testo-con-mvc2</feedburner:origLink></item><item><title>Tip: Esecuzione veloce di Unit Test con Resharper</title><description>&lt;p&gt;Per lanciare direttamente da tastiera il test corrente (in base al caret) con resharper basta mappare la scorciatoia da tastiera come indicato.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/reshaper_2.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="reshaper" border="0" alt="reshaper" src="http://www.ienumerable.it/UserFiles/admin/reshaper_thumb.png" width="560" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/A5U-PkCVZdw/tip-esecuzione-veloce-di-unit-test-con-resharper</link><author>admin</author><comments>http://www.ienumerable.it/blog/post/tip-esecuzione-veloce-di-unit-test-con-resharper#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/tip-esecuzione-veloce-di-unit-test-con-resharper</guid><pubDate>Tue, 04 Jan 2011 23:21:03 GMT</pubDate><category>Resharper</category><category>Tip</category><category>Visualstudio</category><feedburner:origLink>http://www.ienumerable.it/blog/post/tip-esecuzione-veloce-di-unit-test-con-resharper</feedburner:origLink></item><item><title>Visual Studio 2010 e ReadyBoost</title><description>&lt;p&gt;Avendo una chiavetta usb da 4gb inutilizzata ho deciso di provare ReadyBoost sulla workstation del lavoro (Win 7 x64, Xeon 4 core, doppio Raptor e 4gb di ram).&lt;/p&gt;  &lt;p&gt;Questo il grafico per la prima e la seconda esecuzione di vs con un progetto corposo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/readyboost_2.png" rel="shadowbox"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="readyboost" border="0" alt="readyboost" src="http://www.ienumerable.it/UserFiles/admin/readyboost_thumb.png" width="586" height="409" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per configurare il monitor seguite questo post &lt;a href="http://blogs.msdn.com/b/saveenr/archive/2009/05/02/monitoring-readyboost-on-windows-7.aspx"&gt;http://blogs.msdn.com/b/saveenr/archive/2009/05/02/monitoring-readyboost-on-windows-7.aspx&lt;/a&gt;&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/k1-1ZRXROs4/visual-studio-2010-e-readyboost</link><author>admin</author><comments>http://www.ienumerable.it/blog/post/visual-studio-2010-e-readyboost#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/visual-studio-2010-e-readyboost</guid><pubDate>Sat, 27 Nov 2010 17:30:29 GMT</pubDate><category>Readyboost</category><category>Vs2010</category><category>Win7</category><feedburner:origLink>http://www.ienumerable.it/blog/post/visual-studio-2010-e-readyboost</feedburner:origLink></item><item><title>La percezione dei prodotti</title><description>&lt;p&gt;Può un prodotto (o meglio la sua percezione) cambiare le sorti di un’azienda?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/stocks2_2.png" rel="shadowbox"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="stocks2" border="0" alt="stocks2" src="http://www.ienumerable.it/UserFiles/admin/stocks2_thumb.png" width="584" height="229" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Grafico interattivo qui: &lt;a href="http://www.google.com/finance?q=NASDAQ:ADBE,+NASDAQ:GOOG,+msft,+aapl"&gt;http://www.google.com/finance?q=NASDAQ:ADBE,+NASDAQ:GOOG,+msft,+aapl&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Non credo che l’ascesa di apple sia legata solamente all’avvento dell’iPhone ma sicuramente ha contribuito dalla percezione che gli end-user hanno dei prodotti. Ieri ho consigliato ad un familiare di non acquistare un iPad e di aspettare il Samsung Tab. Risposta : “di samsung ho avuto qualche telefono e mi sono sempre trovato male, con l’iPhone mi sono trovato benissimo. Anche se costa di più prendo l’iPad”. Non è l’unica testimonianza del genere che ho raccolto di persona, anche tra professionisti del settore che campano vendendo migliaia di licenze software in ambiente Microsoft.&lt;/p&gt;  &lt;p&gt;Personalmente ho provato MacOS e non riesco ad usarlo per più di cinque minuti, motivo per cui ho sempre girato al largo dalla famiglia Mac “bollandola” da ignorante come una moda.&lt;/p&gt;  &lt;p&gt;Poi un giorno sulla poltrona del dentista (forse con la complicità dell’anestesia, chi può dirlo) si è insinuato il tarlo nella testa. Alla classiche domande di circostanza “che lavoro fai?” ho riposto con un generico “roba di informatica”. Rimango sempre sul vago perché poi scatta subito la richiesta di guardare “solo 2 minuti” la connessione internet che non va, la stampante, acrobat, il video, i virus; qualcuno si azzarda anche a “dovrei reinstallare l’office” o “mi si è rallentato tutto, mi hanno detto di formattarlo” (sono tutte richieste ricevute realmente). Ero pronto a ribattere con un “e’ roba da sistemista, io faccio un altro lavoro. E’ come chiedere ad un infermiere di operare al cervello” che solitamente chiude la conversazione quando il medico se ne esce con : “ho acquistato un mac, con windows era sempre un casino. Ora è tutto più semplice, ogni cosa è dove te l’aspetti e non ho problemi.”&lt;/p&gt;  &lt;p&gt;Non è stato il primo a recitare “esattamente” quella frase (la mettono forse sul libretto di istruzioni?). Imprenditori affermati, liberi professionisti, studenti, utenti comuni.. tutti sottoposti al lavaggio del cervello, questo era il mio pensiero (arrogante lo ammetto) da “esperto” del settore.&lt;/p&gt;  &lt;p&gt;Quel tarlo ha lavorato e lavorato in background fino a che non mi sono detto: “E se avessero ragione?”. Se fossi io prevenuto e perdessi un’opportunità? Mi sono rimesso in gioco, si parte da zero su un terreno che non conosco: ho acquistato iPad e sono soddisfatto del prodotto (anche se di cose ne cambierei nell’os, confido in iOS 4.2). Ora tocca all’iPhone4 e poi finito il training da utente si passa al dietro le quinte prima con MacOs e poi con XCode / Monotouch acquistando un MacBook.&lt;/p&gt;  &lt;p&gt;Se tra qualche mese rimetto tutto su ebay il virus è contaggioso, quindi state alla larga. Se mi sentite sparare boiate o sentite puzza di fanboy riprendetemi e riportatemi sulla retta via.&lt;/p&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/jxw3mVcO7MU/la-percezione-dei-prodotti</link><author>admin</author><comments>http://www.ienumerable.it/blog/post/la-percezione-dei-prodotti#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/la-percezione-dei-prodotti</guid><pubDate>Fri, 10 Sep 2010 17:29:41 GMT</pubDate><category>IPhone Apple iPad MacOs</category><feedburner:origLink>http://www.ienumerable.it/blog/post/la-percezione-dei-prodotti</feedburner:origLink></item><item><title>Resoconto del 1° Dexter Raduno</title><description>&lt;p&gt;Oggi ho avuto il piacere di pranzare con &lt;a href="http://www.tostring.it/about" target="_blank"&gt;Ugo&lt;/a&gt; e &lt;a href="http://www.primordialcode.com/Page/Index/about" target="_blank"&gt;Alessandro&lt;/a&gt; per fare quattro chiacchiere su &lt;a href="http://dexterblogengine.codeplex.com/" target="_blank"&gt;Dexter&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Tanto per stare leggeri &lt;a href="http://www.tostring.it/about" target="_blank"&gt;Ugo&lt;/a&gt; ci ha deliziato portandoci in un ristorantino sul lungomare di San Benedetto a strafogarci di pesce e tra due chiacchiere su &lt;a href="http://www.nhday.eu/" target="_blank"&gt;NHibernate 3&lt;/a&gt;, su &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx" target="_blank"&gt;Razor&lt;/a&gt; e sulla direzione da dare a Dexter il tempo è volato via.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://c0013434.cdn1.cloudfiles.rackspacecloud.com/x2_210c563" width="180" height="240" /&gt;&lt;/p&gt;  &lt;p&gt;Ringrazio &lt;a href="http://www.tostring.it/about" target="_blank"&gt;Ugo&lt;/a&gt; per essersi sbattuto con &lt;a href="http://www.topics.it/" target="_blank"&gt;Mauro&lt;/a&gt; nel procurarmi un iPad e per aver deciso di regalarmi un abbonamento &lt;a href="http://msdn.microsoft.com/it-it/subscriptions/subscriptionschart.aspx" target="_blank"&gt;MSDN Ultimate&lt;/a&gt; che metterò a frutto per studiare per bene le funzionalità avanzate di VS2010.&lt;/p&gt;  &lt;p&gt;Grazie al team di Dexter e a tutto l’ecosistema della Community .Net, è un vero piacere avere a che fare con il gruppo di pazzi scatenati quali siete ;D&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/DSC_0139_2.jpg" rel="shadowbox"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DSC_0139" border="0" alt="DSC_0139" src="http://www.ienumerable.it/UserFiles/admin/DSC_0139_thumb.jpg" width="244" height="197" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Prossimo raduno per la seconda metà di agosto, non mancate!&lt;/p&gt;&lt;h2&gt;Related Content&lt;/h2&gt;&lt;ul&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/cosa-resta-da-fare-per-terminare-la-fase-alpha-del-progetto-ienumerable.it"&gt;Cosa resta da fare per terminare la fase alpha del progetto IEnumerable.it&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/welcome-dexter"&gt;Welcome Dexter&lt;/a&gt; (01/03/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/visual-studio-2010-community-launch-tour---perugia"&gt;Visual Studio 2010 Community Launch Tour - Perugia&lt;/a&gt; (05/02/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/nhibernate-day"&gt;NHibernate Day&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/work-in-progress-lucilla"&gt;Work in progress #lucilla&lt;/a&gt; (04/03/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="/Blog/Related/resoconto-del-1deg-dexter-raduno"&gt;&lt;strong&gt;More related document (2)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/sV_Xg1DLE8c/resoconto-del-1deg-dexter-raduno</link><author>admin</author><comments>http://www.ienumerable.it/blog/post/resoconto-del-1deg-dexter-raduno#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/resoconto-del-1deg-dexter-raduno</guid><pubDate>Sat, 24 Jul 2010 17:58:49 GMT</pubDate><category>Community</category><category>Dexter</category><category>DotNetMarche</category><category>Opensource</category><feedburner:origLink>http://www.ienumerable.it/blog/post/resoconto-del-1deg-dexter-raduno</feedburner:origLink></item><item><title>Razor</title><description>&lt;p&gt;Ho perso qulche ora a giocare con &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx"&gt;Razor&lt;/a&gt; il motore che sta dietro WebPages.&lt;/p&gt;  &lt;p&gt;Questi i primi risultati ;D&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/admin/shave_2.png" rel="shadowbox"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="shave" border="0" alt="shave" src="http://www.ienumerable.it/UserFiles/admin/shave_thumb.png" width="874" height="624" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Related Content&lt;/h2&gt;&lt;ul&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/creare-un-editortemplate-per-gli-enum-con-mvc-2"&gt;Creare un EditorTemplate per gli enum con MVC 2&lt;/a&gt; (05/05/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/esperimenti-con-balsamiq-e-aspnet-mvc"&gt;Esperimenti con Balsamiq e Asp.Net MVC&lt;/a&gt; (04/06/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/work-in-progress-lucilla"&gt;Work in progress #lucilla&lt;/a&gt; (04/03/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/creazione-di-liste-paginate-con-flexigrid-lucillaframework-ed-nhibernate"&gt;Creazione di liste paginate con FlexiGrid, Lucilla.Framework ed NHibernate&lt;/a&gt; (04/04/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="/Blog/Related/razor"&gt;&lt;strong&gt;More related document (1)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/kkAKgNHvx7M/razor</link><author>admin</author><comments>http://www.ienumerable.it/blog/post/razor#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/razor</guid><pubDate>Thu, 08 Jul 2010 07:14:20 GMT</pubDate><category>Aspnetmvc</category><category>Codegen</category><category>Razor</category><feedburner:origLink>http://www.ienumerable.it/blog/post/razor</feedburner:origLink></item><item><title>Questione di virgole</title><description>&lt;p&gt;Ho riscontrato un problema in un js nella manipolazione di un oggetto esperesso in notazione Json e ho utilizzato il debugger js integrato del browser per diagnosticarlo.&lt;/p&gt;  &lt;p&gt;Questo è il codice che crea il problema cercando di accedere ad un oggetto non definito&lt;/p&gt;  &lt;pre class="brush: xml;"&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Watch test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
var list = [{value:1}, {value:2},{value:3},];
for(var c = 0; c &amp;lt; list.length; c++){
    var elem = list[c];
    document.write(elem.value);
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;Notare la virgola&amp;#160; prima della chisura dell’array: questo implica che il nostro array ha un elemento undefined in più, quindi il sull’ultimo elemento il js si pianta tentando di accedere ad una proprietà di un oggetto undefined.&lt;/p&gt;

&lt;p&gt;Ecco cosa accade con i vari browser&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="5"&gt;Primo test: elemento undefined in fondo all’array&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Internet Explorer 8 
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;L’errore viene puntualmente identificato&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_2_3.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_6.png" width="403" height="265" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;andiamo in debug e mettiamo un watch&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_4_1.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_1_2.png" width="508" height="336" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Il nostro array è composto da 3 elementi ma è lungo 4!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Internet Explorer 9 platform preview 
      &lt;br /&gt;&lt;/strong&gt;&lt;/em&gt;Non si aggancia il debugger all’istanza, ma l’errore non si presenta se la pagina è messa in modalità “IE9 Document Mode” mentre nelle altre modalità è presente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Firefox 3.6 beta 4 + Firebug 
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;Firefox se ne frega bellamente, l’array è da 3: nessun errore &lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_6_1.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_2_2.png" width="590" height="404" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Chrome 5.0.375.70 beta 
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;Anche chrome si prende la briga di considerare l’array da 3&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_8_1.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_3_1.png" width="593" height="348" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="5"&gt;Secondo test: elemento undefined in mezzo all’array&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Watch test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
var list = [{value:1}, {value:2},,{value:3}];
for(var c = 0; c &amp;lt; list.length; c++){
    var elem = list[c];
    document.write(elem.value);
}
    document.write('fine');
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Internet Explorer 8 
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;Per explorer non è cambiato nulla, l’array è sempre da 4 e l’errore si presenta puntualmente.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_12_1.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_5_1.png" width="500" height="291" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;em&gt;&lt;strong&gt;Internet Explorer 9 platform preview&lt;/strong&gt;&lt;/em&gt; 

      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;Errore sempre presente, ma è impossibile valutare il debugger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Firefox 3.6 beta 4 + Firebug 
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;L’array è da 4 elementi di cui uno &lt;em&gt;undefined &lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_10_1.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_4_1.png" width="519" height="328" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Chrome 5.0.375.70 beta 
      &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;Anche per Chrome le cose non sono cambiate. 

  &lt;br /&gt;L’errore viene visualizzato solamente con i tool di sviluppo attivi.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_14.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_6_1.png" width="522" height="323" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusioni&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;L’unico debugger a visualizzare correttamente la lista è Firebug che mostra un bel &amp;quot;undefined” &lt;/li&gt;

  &lt;li&gt;Explorer8 ha un comportamento differente dagli altri browser mentre IE9 si allinea al comportamento di FireFox e Chrome &lt;/li&gt;

  &lt;li&gt;Quando possibile far &lt;a href="http://james.newtonking.com/projects/json-net.aspx"&gt;generare il Json da c#&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/i7WKgLf5XLs/questione-di-virgole</link><author>andrea</author><comments>http://www.ienumerable.it/blog/post/questione-di-virgole#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/questione-di-virgole</guid><pubDate>Wed, 09 Jun 2010 21:19:58 GMT</pubDate><category>Browser</category><category>Debugger</category><category>Javascript</category><feedburner:origLink>http://www.ienumerable.it/blog/post/questione-di-virgole</feedburner:origLink></item><item><title>NHibernate Day</title><description>&lt;p&gt;&lt;a href="http://dotnetmarche.org"&gt;DotNetMarche&lt;/a&gt; e &lt;a href="http://www.ugialt.net"&gt;UgiAlt.Net&lt;/a&gt; hanno unito le forze per creare il primo evento dedicado ad &lt;a href="http://www.nhforge.org"&gt;NHibernate&lt;/a&gt; in Italia. Per i dettagli rimando al &lt;a href="http://codeclimber.net.nz/archive/2010/05/18/announcing-first-european-nhibernate-day-italy-nhday.aspx" target="_blank"&gt;post&lt;/a&gt; di &lt;a href="http://twitter.com/simonech" target="_blank"&gt;Simone&lt;/a&gt; ed al &lt;a href="http://www.nhday.eu" target="_blank"&gt;sito dedicato&lt;/a&gt; realizzato grazie all’infaticabile &lt;a href="http://twitter.com/scott4dev" target="_blank"&gt;Claudio&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.nhday.eu/"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_3.png" width="415" height="122" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.nhday.eu"&gt;Let the fun begin!&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Related Content&lt;/h2&gt;&lt;ul&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/aperte-le-donazioni-ad-nhibernate"&gt;Aperte le donazioni ad NHibernate&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/visual-studio-2010-community-launch-tour---perugia"&gt;Visual Studio 2010 Community Launch Tour - Perugia&lt;/a&gt; (05/02/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/resoconto-del-1deg-dexter-raduno"&gt;Resoconto del 1° Dexter Raduno&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/usertypes-per-database-legacy"&gt;Usertypes per database legacy&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/tra-presente-e-futuro-delle-interfacce-utente-con-wpf-e-mvvm"&gt;Tra presente e futuro delle interfacce utente con WPF e MVVM&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="/Blog/Related/nhibernate-day"&gt;&lt;strong&gt;More related document (5)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/_fFTtmwes_g/nhibernate-day</link><author>andrea</author><comments>http://www.ienumerable.it/blog/post/nhibernate-day#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/nhibernate-day</guid><pubDate>Tue, 18 May 2010 09:00:54 GMT</pubDate><category>DotNetMarche</category><category>Evento</category><category>NHibernate</category><feedburner:origLink>http://www.ienumerable.it/blog/post/nhibernate-day</feedburner:origLink></item><item><title>Creare un EditorTemplate per gli enum con MVC 2</title><description>&lt;p&gt;&lt;strong&gt;Intro&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Nelle mie applicazioni faccio largo uso di enums (e chi non lo fa?), mi sono quindi creato una serie di helpers / providers per la gestione della UI bindata con gli enum.&lt;/p&gt;  &lt;p&gt;In WebForms utilizzo:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;IEnumDescriptionProvider: servizio che estrapola le descrizioni.      &lt;ul&gt;       &lt;li&gt;LocalizedEnumDescriptionProvider per le descrizioni localizzate &lt;/li&gt;        &lt;li&gt;AttributeEnumDescriptionProvider per leggere degli attributi custom &lt;/li&gt;        &lt;li&gt;AutomaticCaseEnumDescriptionProvider per la conversione automatica al cambio di case (UnValore –&amp;gt; Un Valore) &lt;/li&gt;        &lt;li&gt;DefaultEnumDescriptionProvider che fa il semplice ToString()          &lt;br /&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;IDropDownItemsProvider per creare le liste di valori da passare alle dropdown.      &lt;ul&gt;       &lt;li&gt;DefaultEnumDropDownItemsProvider che ha per chiave il valore numerico dell’enum e per testo la descrizione estrapolata tramite i provider. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Visto che MVC2 è estendibile ho provato a riportare le funzionalità di base su questa piattaforma.&lt;/p&gt;  &lt;p&gt;Questo è il model &lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;public class Movie
{
    [Required]
    public string Title { get; set; }
    public Rating Rating { get; set; }
}&lt;/pre&gt;

&lt;p&gt;e questo l’enum&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public enum Rating 
{
    None,
    Horrible,
    Bad,
    Poor,
    BelowAverage,
    Average,
    AboveAverage,
    Good,
    VeryGood,
    Superb,
    Excellent
}&lt;/pre&gt;
Sfruttando il nuovo motore di template possiamo scrivere la form di inserimento dati come 

&lt;pre class="brush: csharp;"&gt;&amp;lt;% using (Html.BeginForm()){%&amp;gt;
   &amp;lt;%= Html.EditorForModel() %&amp;gt;
   &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Create&amp;quot; /&amp;gt;
&amp;lt;%}%&amp;gt;&lt;/pre&gt;

&lt;p&gt;Il risultato è il seguente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_2_2.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_2.png" width="244" height="144" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Decisamente poco user friendly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 – gestire le descrizioni tramite attributo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MVC2 utilizza DataAnnotations e l’attributo DisplayNameAttribute per poter impostare una label custom sui controlli. Purtroppo l’attributo DisplayNameAttribute non è utilizzabile direttamente sul singolo valore dell’enum. Bypassiamo il problema creando la nostra versione e cambiando l’AttributeUsage&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field)]
public class EnumDisplayNameAttribute : DisplayNameAttribute
{
    public EnumDisplayNameAttribute(string displayName)
        :base(displayName)
    {
    }
}&lt;/pre&gt;

&lt;p&gt;In questo modo è possibile decorare l’enum &lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;[EnumDisplayName(&amp;quot;** Rating&amp;quot;)]
public enum Rating 
{
    None,
    Horrible,
    Bad,
    Poor,
    [EnumDisplayName(&amp;quot;Below Average&amp;quot;)]
    BelowAverage,
    Average,
    [EnumDisplayName(&amp;quot;Above Average&amp;quot;)]
    AboveAverage,
    Good,
    [EnumDisplayName(&amp;quot;Very Good&amp;quot;)]
    VeryGood,
    Superb,
    [EnumDisplayName(&amp;quot;Just... WOW!&amp;quot;)]
    Excellent
}&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Step 2 – estendere l’enum&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Abbiamo bisogno di leggere il valore degli enum e di poter creare una lista di valori da passare al controllo DropDown. Implementiamo entrambe le funzionalità come Extension Methods&lt;/p&gt;

&lt;pre class="brush: xml;"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace EnumTemplates.Helpers
{
    public static class EnumExtensions
    {
        public static string GetDisplayName(this Enum enumItem)
        {
            var mi = enumItem.GetType().GetMember(enumItem.ToString()).FirstOrDefault();
            if(mi != null)
            {
                var dn = (EnumDisplayNameAttribute)(mi.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)).FirstOrDefault();
                if (dn != null)
                    return dn.DisplayName;
            }

            return enumItem.ToString();
        }

        public static IEnumerable&amp;lt;SelectListItem&amp;gt; ToSelectList(this Enum enumItem)
        {
            var enumType = enumItem.GetType();

            return (from object value in Enum.GetValues(enumType)
                    select new SelectListItem
                               {
                                   Selected = value.ToString() == enumItem.ToString(), 
                                   Text = ((Enum)value).GetDisplayName(), 
                                   Value = ((int)value).ToString()
                               }).ToList();
        }
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Step 3 – Creare un template di default per gli Enum&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nella cartella Views\Shared\EditorTemplates creiamo un nuovo usercontrol Enum.ascx&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_6.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_2_1.png" width="248" height="286" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;il cui sorgente è il seguente&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;&amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewUserControl&amp;lt;Enum&amp;gt;&amp;quot; %&amp;gt;
&amp;lt;%@ Import Namespace=&amp;quot;EnumTemplates.Helpers&amp;quot; %&amp;gt;
&amp;lt;%= Html.DropDownListFor(x =&amp;gt; x,Model.ToSelectList()) %&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 – Abilitare il template per il nostro Enum&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Piuttosto che decorare con l’attributo UIHint ogni property del nostro ViewModel (che è un approccio decisamente poco DRY) proviamo a decorare direttamente l’enum Ratings.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_8.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_3.png" width="661" height="406" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Anche in questo caso ci sono limitazioni sull’utilizzo dell’attributo, la soluzione la conosciamo già ;D&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System;
using System.ComponentModel.DataAnnotations;

namespace EnumTemplates.Helpers
{
    [AttributeUsage(AttributeTargets.Enum)]
    public class EnumUIHintAttribute : UIHintAttribute
    {
        public EnumUIHintAttribute(string uiHint)
            : base(uiHint)
        {
            
        }
    }
}&lt;/pre&gt;

&lt;p&gt;a questo punto possiamo definire il nostro enumerativo come&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using EnumTemplates.Helpers;

namespace EnumTemplates.Models
{
    [EnumDisplayName(&amp;quot;** Rating&amp;quot;)]
    [EnumUIHint(&amp;quot;Enum&amp;quot;)]
    public enum Rating 
    {
        None,
        Horrible,
        Bad,
        Poor,
        [EnumDisplayName(&amp;quot;Below Average&amp;quot;)]
        BelowAverage,
        Average,
        [EnumDisplayName(&amp;quot;Above Average&amp;quot;)]
        AboveAverage,
        Good,
        [EnumDisplayName(&amp;quot;Very Good&amp;quot;)]
        VeryGood,
        Superb,
        [EnumDisplayName(&amp;quot;Just... WOW!&amp;quot;)]
        Excellent
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Step 5 – Up &amp;amp; Running&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step fondamentale…. F5 e test nel browser..&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_10.png" rel="shadowbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_4.png" width="255" height="343" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;

&lt;p&gt;e se diamo un’occhiata al sorgente HTML troviamo&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
&lt;a href="http://www.ienumerable.it/UserFiles/andrea/image_12.png" rel="shadowbox"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.ienumerable.it/UserFiles/andrea/image_thumb_5.png" width="604" height="306" /&gt;&lt;/a&gt;

&lt;p&gt;decisamente meglio.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ienumerable.it/userfiles/andrea/enumtemplates.zip" target="_blank"&gt;Sorgenti&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Related Content&lt;/h2&gt;&lt;ul&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/razor"&gt;Razor&lt;/a&gt; (07/08/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/esperimenti-con-balsamiq-e-aspnet-mvc"&gt;Esperimenti con Balsamiq e Asp.Net MVC&lt;/a&gt; (04/06/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/work-in-progress-lucilla"&gt;Work in progress #lucilla&lt;/a&gt; (04/03/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/creazione-di-liste-paginate-con-flexigrid-lucillaframework-ed-nhibernate"&gt;Creazione di liste paginate con FlexiGrid, Lucilla.Framework ed NHibernate&lt;/a&gt; (04/04/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="/Blog/Related/creare-un-editortemplate-per-gli-enum-con-mvc-2"&gt;&lt;strong&gt;More related document (1)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/mBeBpVP6Zv8/creare-un-editortemplate-per-gli-enum-con-mvc-2</link><author>andrea</author><comments>http://www.ienumerable.it/blog/post/creare-un-editortemplate-per-gli-enum-con-mvc-2#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/creare-un-editortemplate-per-gli-enum-con-mvc-2</guid><pubDate>Wed, 05 May 2010 07:00:00 GMT</pubDate><category>Aspnetmvc</category><category>Attributes</category><category>Enums</category><category>Templates</category><feedburner:origLink>http://www.ienumerable.it/blog/post/creare-un-editortemplate-per-gli-enum-con-mvc-2</feedburner:origLink></item><item><title>Visual Studio 2010 Community Launch Tour - Perugia</title><description>&lt;p&gt;Giovedì scorso ho avuto l’onore di presentare MVC2 al Community Tour di lancio di Visual Studio 2010 in quel di Perugia: raccolgo in questo post qualche considerazione in merito ed i link al materiale.&lt;/p&gt;  &lt;p&gt;Prima di tutto ringrazio i partecipanti che restando ben oltre il tempo previsto hanno seguito con attenzione la sessione si MVC2 che è stata rivista “on the fly” in base ai feedback.&lt;/p&gt;  &lt;p&gt;La sessione era nata per mostrare le novità di MVC2 rispetto alla versione precedente ma già alla prima domanda ai partecipanti ha cambiato direzione.&lt;/p&gt;  &lt;p&gt;Prima domanda: “Chi conosce MVC?”… e nessun braccio alzato. &lt;/p&gt;  &lt;p&gt;Seconda domanda: “Preferite una sessione slide o codice?”… risposta scontata.. Codice&lt;/p&gt;  &lt;p&gt;In 30 secondi polverizzato il lavoro fatto per preparare la mia sessione, non male come inizio.&lt;/p&gt;  &lt;p&gt;Alla fine è andata bene, l’attenzione è stata alta fino alla fine (oltre le 19.00) e i primi feedback sono sembrati più che buoni.&lt;/p&gt;  &lt;p&gt;Probabilmente manca un evento hands-on (ipotesi di cui discuto da tempo con i ragazzi della community) per dare una bella spinta nella direzione giusta e far toccare con mano i benefici di MVC. Magari dopo l’estate si organizza qualcosa… stay tuned!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_3936890"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Asp.Net MVC 2 :: VS 2010 Community Tour" href="http://www.slideshare.net/andreabalducci/aspnet-mvc-2-vs-2010-community-tour"&gt;Asp.Net MVC 2 :: VS 2010 Community Tour&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse3936890" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=asp-netmvc2-vs2010-100502055023-phpapp02&amp;amp;stripped_title=aspnet-mvc-2-vs-2010-community-tour" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse3936890" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=asp-netmvc2-vs2010-100502055023-phpapp02&amp;amp;stripped_title=aspnet-mvc-2-vs-2010-community-tour" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/andreabalducci"&gt;andreabalducci&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt; Codice e slide scaricabili da &lt;a href="http://ienumerable.codeplex.com/SourceControl/changeset/changes/99c1cc2736db"&gt;http://ienumerable.codeplex.com/SourceControl/changeset/changes/99c1cc2736db&lt;/a&gt;&lt;h2&gt;Related Content&lt;/h2&gt;&lt;ul&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/nhibernate-day"&gt;NHibernate Day&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/resoconto-del-1deg-dexter-raduno"&gt;Resoconto del 1° Dexter Raduno&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/source-control-ampamp-shell-integration"&gt;Source Control &amp;amp;&amp;amp; Shell Integration&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/tra-presente-e-futuro-delle-interfacce-utente-con-wpf-e-mvvm"&gt;Tra presente e futuro delle interfacce utente con WPF e MVVM&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="/Blog/Related/visual-studio-2010-community-launch-tour---perugia"&gt;&lt;strong&gt;More related document (1)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/UTIARnAsYN8/visual-studio-2010-community-launch-tour---perugia</link><author>andrea</author><comments>http://www.ienumerable.it/blog/post/visual-studio-2010-community-launch-tour---perugia#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/visual-studio-2010-community-launch-tour---perugia</guid><pubDate>Sun, 02 May 2010 12:44:37 GMT</pubDate><category>Aspnetmvc</category><category>Codeplex</category><category>DotNetMarche</category><category>DotNetUmbria</category><category>VS2010</category><feedburner:origLink>http://www.ienumerable.it/blog/post/visual-studio-2010-community-launch-tour---perugia</feedburner:origLink></item><item><title>Usertypes per database legacy</title><description>&lt;p&gt;Mi trovo a lavorare su un database legacy in cui non vengono usati i null sulle reference esterne. Questo significa che la chiave stringa null è pari a stringa vuota e gli interi (16 e 32 bit) sono pari a zero.&lt;/p&gt;  &lt;p&gt;Per mappare questa casistica su NHibernate ho creato tre usertypes che fanno automaticamente la conversione in lettura / scrittura trasformando i valori “Zero” in null e viceversa.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;String&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.SqlTypes;
using NHibernate.UserTypes;

namespace Prxm.Framework.Data.NHibernate.UserTypes
{
    public class EmptyStringAsNullType : IUserType, IEnhancedUserType
    {
        #region IUserType Members
        public bool IsMutable
        {
            get { return false; }
        }

        public Type ReturnedType
        {
            get { return typeof(string); }
        }

        public SqlType[] SqlTypes
        {
            get { return new[] { NHibernateUtil.String.SqlType }; }
        }

        public object NullSafeGet(IDataReader rs, string[] names, object owner)
        {
            var obj = NHibernateUtil.String.NullSafeGet(rs, names[0]);

            if (obj == null)
            {
                return null;
            }

            var value = (string)obj;
            if (String.IsNullOrEmpty(value))
            {
                return null;
            }

            return value.Trim();
        }

        public void NullSafeSet(IDbCommand cmd, object value, int index)
        {
            if (value == null)
            {
                ((IDataParameter)cmd.Parameters[index]).Value = String.Empty;
            }
            else
            {
                ((IDataParameter)cmd.Parameters[index]).Value = ((string)value).Trim();
            }
        }

        public object DeepCopy(object value)
        {
            return value;
        }

        public object Replace(object original, object target, object owner)
        {
            return original;
        }

        public object Assemble(object cached, object owner)
        {
            return cached;
        }

        public object Disassemble(object value)
        {
            return value;
        }

        public new bool Equals(object x, object y)
        {
            if (ReferenceEquals(x, y))
            {
                return true;
            }

            if (x == null || y == null)
            {
                return false;
            }

            return x.Equals(y);
        }

        public int GetHashCode(object x)
        {
            return x == null ? typeof(string).GetHashCode() + 473 : x.GetHashCode();
        }
        #endregion

        public object FromXMLString(string xml)
        {
            return xml;
        }

        public string ObjectToSQLString(object value)
        {
            return (string) value ?? string.Empty;
        }

        public string ToXMLString(object value)
        {
            return (string)value ?? string.Empty;
        }
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Int32&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.SqlTypes;
using NHibernate.UserTypes;

namespace Prxm.Framework.Data.NHibernate.UserTypes
{
    public class Int32ReferenceType : IEnhancedUserType
    {
        #region Implementation of IUserType

        /// &amp;lt;summary&amp;gt;
        /// Compare two instances of the class mapped by this type for persistent &amp;quot;equality&amp;quot;
        ///             ie. equality of persistent state
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;x&amp;quot;/&amp;gt;&amp;lt;param name=&amp;quot;y&amp;quot;/&amp;gt;
        /// &amp;lt;returns/&amp;gt;
        public bool Equals(object x, object y)
        {
            if (ReferenceEquals(x, y))
            {
                return true;
            }

            if (x == null || y == null)
            {
                return false;
            }

            return x.Equals(y);
        }

        /// &amp;lt;summary&amp;gt;
        /// Get a hashcode for the instance, consistent with persistence &amp;quot;equality&amp;quot;
        /// &amp;lt;/summary&amp;gt;
        public int GetHashCode(object x)
        {
            return x == null ? typeof(string).GetHashCode() + 473 : x.GetHashCode();
        }

        /// &amp;lt;summary&amp;gt;
        /// Retrieve an instance of the mapped class from a JDBC resultset.
        ///             Implementors should handle possibility of null values.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;rs&amp;quot;&amp;gt;a IDataReader&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;names&amp;quot;&amp;gt;column names&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;owner&amp;quot;&amp;gt;the containing entity&amp;lt;/param&amp;gt;
        /// &amp;lt;returns/&amp;gt;
        /// &amp;lt;exception cref=&amp;quot;T:NHibernate.HibernateException&amp;quot;&amp;gt;HibernateException&amp;lt;/exception&amp;gt;
        public object NullSafeGet(IDataReader rs, string[] names, object owner)
        {
            var obj = NHibernateUtil.Int32.NullSafeGet(rs, names[0]);

            if (obj == null)
            {
                return null;
            }

            var value = (int)obj;
            if (value == 0)
            {
                return null;
            }

            return value;
        }

        /// &amp;lt;summary&amp;gt;
        /// Write an instance of the mapped class to a prepared statement.
        ///             Implementors should handle possibility of null values.
        ///             A multi-column type should be written to parameters starting from index.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;cmd&amp;quot;&amp;gt;a IDbCommand&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;the object to write&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;index&amp;quot;&amp;gt;command parameter index&amp;lt;/param&amp;gt;&amp;lt;exception cref=&amp;quot;T:NHibernate.HibernateException&amp;quot;&amp;gt;HibernateException&amp;lt;/exception&amp;gt;
        public void NullSafeSet(IDbCommand cmd, object value, int index)
        {
            if (value == null)
            {
                ((IDataParameter)cmd.Parameters[index]).Value = 0;
            }
            else
            {
                ((IDataParameter)cmd.Parameters[index]).Value = (int)value;
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Return a deep copy of the persistent state, stopping at entities and at collections.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;generally a collection element or entity field&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;
        /// a copy
        /// &amp;lt;/returns&amp;gt;
        public object DeepCopy(object value)
        {
            return value;
        }

        /// &amp;lt;summary&amp;gt;
        /// During merge, replace the existing (&amp;lt;paramref name=&amp;quot;target&amp;quot;/&amp;gt;) value in the entity
        ///             we are merging to with a new (&amp;lt;paramref name=&amp;quot;original&amp;quot;/&amp;gt;) value from the detached
        ///             entity we are merging. For immutable objects, or null values, it is safe to simply
        ///             return the first parameter. For mutable objects, it is safe to return a copy of the
        ///             first parameter. For objects with component values, it might make sense to
        ///             recursively replace component values.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;original&amp;quot;&amp;gt;the value from the detached entity being merged&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;target&amp;quot;&amp;gt;the value in the managed entity&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;owner&amp;quot;&amp;gt;the managed entity&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;
        /// the value to be merged
        /// &amp;lt;/returns&amp;gt;
        public object Replace(object original, object target, object owner)
        {
            return original;
        }

        /// &amp;lt;summary&amp;gt;
        /// Reconstruct an object from the cacheable representation. At the very least this
        ///             method should perform a deep copy if the type is mutable. (optional operation)
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;cached&amp;quot;&amp;gt;the object to be cached&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;owner&amp;quot;&amp;gt;the owner of the cached object&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;
        /// a reconstructed object from the cachable representation
        /// &amp;lt;/returns&amp;gt;
        public object Assemble(object cached, object owner)
        {
            return cached;
        }

        /// &amp;lt;summary&amp;gt;
        /// Transform the object into its cacheable representation. At the very least this
        ///             method should perform a deep copy if the type is mutable. That may not be enough
        ///             for some implementations, however; for example, associations must be cached as
        ///             identifier values. (optional operation)
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;the object to be cached&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;
        /// a cacheable representation of the object
        /// &amp;lt;/returns&amp;gt;
        public object Disassemble(object value)
        {
            return value;
        }

        /// &amp;lt;summary&amp;gt;
        /// The SQL types for the columns mapped by this type. 
        /// &amp;lt;/summary&amp;gt;
        public SqlType[] SqlTypes
        {
            get { return new[] { NHibernateUtil.Int32.SqlType }; }
        }

        /// &amp;lt;summary&amp;gt;
        /// The type returned by &amp;lt;c&amp;gt;NullSafeGet()&amp;lt;/c&amp;gt;
        /// &amp;lt;/summary&amp;gt;
        public Type ReturnedType
        {
            get { return typeof(int); }
        }

        /// &amp;lt;summary&amp;gt;
        /// Are objects of this type mutable?
        /// &amp;lt;/summary&amp;gt;
        public bool IsMutable
        {
            get { return false; }
        }

        #endregion

        #region Implementation of IEnhancedUserType

        /// &amp;lt;summary&amp;gt;
        /// Parse a string representation of this value, as it appears
        ///             in an XML document.
        /// &amp;lt;/summary&amp;gt;
        public object FromXMLString(string xml)
        {
            return xml;
        }

        /// &amp;lt;summary&amp;gt;
        /// Return an SQL literal representation of the value
        /// &amp;lt;/summary&amp;gt;
        public string ObjectToSQLString(object value)
        {
            return value != null ? value.ToString() : &amp;quot;0&amp;quot;;
        }

        /// &amp;lt;summary&amp;gt;
        /// Return a string representation of this value, as it
        ///             should appear in an XML document
        /// &amp;lt;/summary&amp;gt;
        public string ToXMLString(object value)
        {
            return value != null ? value.ToString() : &amp;quot;0&amp;quot;;
        }

        #endregion
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Int16&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.SqlTypes;
using NHibernate.UserTypes;

namespace Prxm.Framework.Data.NHibernate.UserTypes
{
    public class Int16ReferenceType : IEnhancedUserType
    {
        #region Implementation of IUserType

        /// &amp;lt;summary&amp;gt;
        /// Compare two instances of the class mapped by this type for persistent &amp;quot;equality&amp;quot;
        ///             ie. equality of persistent state
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;x&amp;quot;/&amp;gt;&amp;lt;param name=&amp;quot;y&amp;quot;/&amp;gt;
        /// &amp;lt;returns/&amp;gt;
        public bool Equals(object x, object y)
        {
            if (ReferenceEquals(x, y))
            {
                return true;
            }

            if (x == null || y == null)
            {
                return false;
            }

            return x.Equals(y);
        }

        /// &amp;lt;summary&amp;gt;
        /// Get a hashcode for the instance, consistent with persistence &amp;quot;equality&amp;quot;
        /// &amp;lt;/summary&amp;gt;
        public int GetHashCode(object x)
        {
            return x == null ? typeof(string).GetHashCode() + 473 : x.GetHashCode();
        }

        /// &amp;lt;summary&amp;gt;
        /// Retrieve an instance of the mapped class from a JDBC resultset.
        ///             Implementors should handle possibility of null values.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;rs&amp;quot;&amp;gt;a IDataReader&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;names&amp;quot;&amp;gt;column names&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;owner&amp;quot;&amp;gt;the containing entity&amp;lt;/param&amp;gt;
        /// &amp;lt;returns/&amp;gt;
        /// &amp;lt;exception cref=&amp;quot;T:NHibernate.HibernateException&amp;quot;&amp;gt;HibernateException&amp;lt;/exception&amp;gt;
        public object NullSafeGet(IDataReader rs, string[] names, object owner)
        {
            var obj = NHibernateUtil.Int16.NullSafeGet(rs, names[0]);

            if (obj == null)
            {
                return null;
            }

            var value = (Int16)obj;
            if (value == 0)
            {
                return null;
            }

            return value;
        }

        /// &amp;lt;summary&amp;gt;
        /// Write an instance of the mapped class to a prepared statement.
        ///             Implementors should handle possibility of null values.
        ///             A multi-column type should be written to parameters starting from index.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;cmd&amp;quot;&amp;gt;a IDbCommand&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;the object to write&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;index&amp;quot;&amp;gt;command parameter index&amp;lt;/param&amp;gt;&amp;lt;exception cref=&amp;quot;T:NHibernate.HibernateException&amp;quot;&amp;gt;HibernateException&amp;lt;/exception&amp;gt;
        public void NullSafeSet(IDbCommand cmd, object value, int index)
        {
            if (value == null)
            {
                ((IDataParameter)cmd.Parameters[index]).Value = (Int16)0;
            }
            else
            {
                ((IDataParameter)cmd.Parameters[index]).Value = (Int16)value;
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Return a deep copy of the persistent state, stopping at entities and at collections.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;generally a collection element or entity field&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;
        /// a copy
        /// &amp;lt;/returns&amp;gt;
        public object DeepCopy(object value)
        {
            return value;
        }

        /// &amp;lt;summary&amp;gt;
        /// During merge, replace the existing (&amp;lt;paramref name=&amp;quot;target&amp;quot;/&amp;gt;) value in the entity
        ///             we are merging to with a new (&amp;lt;paramref name=&amp;quot;original&amp;quot;/&amp;gt;) value from the detached
        ///             entity we are merging. For immutable objects, or null values, it is safe to simply
        ///             return the first parameter. For mutable objects, it is safe to return a copy of the
        ///             first parameter. For objects with component values, it might make sense to
        ///             recursively replace component values.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;original&amp;quot;&amp;gt;the value from the detached entity being merged&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;target&amp;quot;&amp;gt;the value in the managed entity&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;owner&amp;quot;&amp;gt;the managed entity&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;
        /// the value to be merged
        /// &amp;lt;/returns&amp;gt;
        public object Replace(object original, object target, object owner)
        {
            return original;
        }

        /// &amp;lt;summary&amp;gt;
        /// Reconstruct an object from the cacheable representation. At the very least this
        ///             method should perform a deep copy if the type is mutable. (optional operation)
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;cached&amp;quot;&amp;gt;the object to be cached&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;owner&amp;quot;&amp;gt;the owner of the cached object&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;
        /// a reconstructed object from the cachable representation
        /// &amp;lt;/returns&amp;gt;
        public object Assemble(object cached, object owner)
        {
            return cached;
        }

        /// &amp;lt;summary&amp;gt;
        /// Transform the object into its cacheable representation. At the very least this
        ///             method should perform a deep copy if the type is mutable. That may not be enough
        ///             for some implementations, however; for example, associations must be cached as
        ///             identifier values. (optional operation)
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;the object to be cached&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;
        /// a cacheable representation of the object
        /// &amp;lt;/returns&amp;gt;
        public object Disassemble(object value)
        {
            return value;
        }

        /// &amp;lt;summary&amp;gt;
        /// The SQL types for the columns mapped by this type. 
        /// &amp;lt;/summary&amp;gt;
        public SqlType[] SqlTypes
        {
            get { return new[] { NHibernateUtil.Int16.SqlType }; }
        }

        /// &amp;lt;summary&amp;gt;
        /// The type returned by &amp;lt;c&amp;gt;NullSafeGet()&amp;lt;/c&amp;gt;
        /// &amp;lt;/summary&amp;gt;
        public Type ReturnedType
        {
            get { return typeof(Int16); }
        }

        /// &amp;lt;summary&amp;gt;
        /// Are objects of this type mutable?
        /// &amp;lt;/summary&amp;gt;
        public bool IsMutable
        {
            get { return false; }
        }

        #endregion

        #region Implementation of IEnhancedUserType

        /// &amp;lt;summary&amp;gt;
        /// Parse a string representation of this value, as it appears
        ///             in an XML document.
        /// &amp;lt;/summary&amp;gt;
        public object FromXMLString(string xml)
        {
            return xml;
        }

        /// &amp;lt;summary&amp;gt;
        /// Return an SQL literal representation of the value
        /// &amp;lt;/summary&amp;gt;
        public string ObjectToSQLString(object value)
        {
            return value != null ? value.ToString() : &amp;quot;0&amp;quot;;
        }

        /// &amp;lt;summary&amp;gt;
        /// Return a string representation of this value, as it
        ///             should appear in an XML document
        /// &amp;lt;/summary&amp;gt;
        public string ToXMLString(object value)
        {
            return value != null ? value.ToString() : &amp;quot;0&amp;quot;;
        }

        #endregion
    }
}&lt;/pre&gt;&lt;h2&gt;Related Content&lt;/h2&gt;&lt;ul&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/aperte-le-donazioni-ad-nhibernate"&gt;Aperte le donazioni ad NHibernate&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/nhibernate-day"&gt;NHibernate Day&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/14deg-workshop-dotnetmarche-ndash-introduzione-ai-framework-per-ioc"&gt;14° Workshop DotNetMarche – Introduzione ai framework per IoC&lt;/a&gt; (17/07/2012)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/work-in-progress-lucilla"&gt;Work in progress #lucilla&lt;/a&gt; (04/03/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="http://www.ienumerable.it/blog/post/creazione-di-liste-paginate-con-flexigrid-lucillaframework-ed-nhibernate"&gt;Creazione di liste paginate con FlexiGrid, Lucilla.Framework ed NHibernate&lt;/a&gt; (04/04/2010)&lt;/li&gt;&lt;li style="list-style-type: none"&gt;&lt;a href="/Blog/Related/usertypes-per-database-legacy"&gt;&lt;strong&gt;More related document (2)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;</description><link>http://feedproxy.google.com/~r/ienumerable/~3/MDyByxaY9hs/usertypes-per-database-legacy</link><author>andrea</author><comments>http://www.ienumerable.it/blog/post/usertypes-per-database-legacy#feedback</comments><guid isPermaLink="false">http://www.ienumerable.it/blog/post/usertypes-per-database-legacy</guid><pubDate>Wed, 21 Apr 2010 08:28:02 GMT</pubDate><category>C#</category><category>NHibernate</category><category>Orm</category><category>Usertypes</category><feedburner:origLink>http://www.ienumerable.it/blog/post/usertypes-per-database-legacy</feedburner:origLink></item></channel></rss>
