<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>blogs.ASPItalia.com</title><link>http://blogs.aspitalia.com//cradle//</link><description>blogs.ASPItalia.com</description><language>it-it</language><copyright>1998-2013 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Cortana' 2013.5.16</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Mon, 07 Jan 2013 13:25:47 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.aspitalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com//cradle//</link></image><item><title>Azure Mobile Services a Milano</title><link>http://blogs.aspitalia.com/cradle/post2806/Azure-Mobile-Services-Milano.aspx</link><pubDate>Mon, 07 Jan 2013 13:25:47 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2806" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Il prossimo Giovedì 10 Gennaio, si terrà in sede Microsoft Italia a Milano, un &lt;a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032539095&amp;amp;culture=it-IT"&gt;evento dedicato ad Azure e ASP.NET&lt;/a&gt;. Io ho l'onore di essere tra gli speaker, e terrò una sessione su Azure Mobile Services: si tratta di una funzionalità che, sebbene sia ancora in preview, mi sta appassionando davvero tantissimo. Ne ha già parlato il mio compagno di merende &lt;a href="http://www.cristiancivera.com/"&gt;Cristian Civera&lt;/a&gt; in un articolo qui su ASPItalia.com e, se sviluppate applicazioni mobile (Win8, Windows Phone, ma anche iOS) che necessitano uno &lt;strong&gt;strato di servizi&lt;/strong&gt;, se avete bisogno di un'infrastruttura per le &lt;strong&gt;push notification&lt;/strong&gt; o di implementare una &lt;strong&gt;security basata su OAuth&lt;/strong&gt;, provate a buttarci un occhio, perché sono decisamente interessanti.&lt;/p&gt; &lt;p&gt;Al momento le registrazioni sono sold-out, se siete interessati, &lt;a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032539095&amp;amp;culture=it-IT"&gt;provate a mettervi in lista d'attesa&lt;/a&gt; e incrociamo le dita tutti insieme. E, per chi ci sarà,  ci vediamo lì, fatevi riconoscere! &lt;img  alt="Smile" src="http://blogs.aspitalia.com/img/cradle/windows-live-writer/azure-mobile-services-a-milano_ad94/wlemoticon-smile_2.png"&gt;&lt;/p&gt; &lt;p&gt;Ciao!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Windows_8/" rel="tag"&gt;Windows 8&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Azure/" rel="tag"&gt;Windows Azure&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Client/" rel="tag"&gt;Windows Client&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Phone/" rel="tag"&gt;Windows Phone&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Phone_7/" rel="tag"&gt;Windows Phone 7&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Phone_7.1/" rel="tag"&gt;Windows Phone 7.1&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Phone_7.1.1/" rel="tag"&gt;Windows Phone 7.1.1&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Phone_7.5/" rel="tag"&gt;Windows Phone 7.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Phone_8/" rel="tag"&gt;Windows Phone 8&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2806/Azure-Mobile-Services-Milano.aspx"&gt;&lt;em&gt;Azure Mobile Services a Milano&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Misc, Windows 8, Windows Azure, Windows Client, Windows Phone, Windows Phone 7, Windows Phone 7.1, Windows Phone 7.1.1, Windows Phone 7.5, Windows Phone 8</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2806/Azure-Mobile-Services-Milano.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2806/Azure-Mobile-Services-Milano.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2806.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2806</trackback:ping></item><item><title>Windows 8 su MacBook Pro, la mia esperienza</title><link>http://blogs.aspitalia.com/cradle/post2777/Windows-MacBook-Esperienza.aspx</link><pubDate>Mon, 20 Aug 2012 06:26:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2777" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Negli ultimi 2-3 giorni mi sono "divertito" (per modo di dire) ad aggiornare il mio MacBook Pro a Windows 8, vi racconto com'è andata.&lt;/p&gt; &lt;p&gt;La configurazione di partenza era una partizione Boot Camp con Windows 7 Ultimate e Boot Camp 3.3. Nel mio sistema casalingo,&lt;strong&gt; effettuo backup giornalieri dell'hard disk&lt;/strong&gt; e mantengo i dati più importanti &lt;strong&gt;sincronizzati su SkyDrive&lt;/strong&gt;, quindi nessuna paura di perdere informazioni. Tuttavia, ho fatto anche un ulteriore &lt;strong&gt;backup con Easy Transfer&lt;/strong&gt;, non si sa mai che capiti di dover ripartire da zero, e almeno ci manteniamo i settings e abbiamo una bella lista delle applicazioni da reinstallare. Il metodo più semplice sarebbe una bella image del disco, purtroppo però su Mac non è così banale effettuare il restore, magari ne parleremo un'altra volta, però purtroppo è una sfiga con cui si deve convivere.&lt;/p&gt; &lt;p&gt;Il primo esperimento che ho provato è stato quello dell'upgrade verso Windows 8 Pro. L'installazione è stata relativamente veloce, una mezz'oretta più o meno, è si è conclusa senza problemi. Al riavvio mi sono effettivamente ritrovato sul nuovo sistema Microsoft, con tutto il software già installato correttamente funzionante, a parte alcune eccezioni:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;MagicISO, che non funziona su Windows 8, e che comunque è assolutamente superfluo visto che ora la funzionalità di mounting delle ISO è nativa nel sistema; ho risolto rimuovendo questo tool. &lt;li&gt;Shrew Soft VPN Client, un tool che uso per accedere ad alcune VPN di clienti, che si appoggia ad un servizio Windows che, da un'occhiata sul Task Manager, si beveva un sacco di CPU senza funzionare. Ho risolto rimuovendo tutto e reinstallando. &lt;li&gt;La webcam FaceTime HD Camera non è stata riconosciuta, ma un update driver ha risolto tutto da solo &lt;li&gt;Il trackpad non andava, non era riconosciuto, non appariva tra i device di boot camp e il driver non si aggiornava&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;L'ultimo punto mi ha creato parecchie difficoltà, ho smanettato un po' con i driver, ma non c'è stato davvero verso, neanche installando manualmente la versione 4.0 del driver del solo trackpad. Ho letto comunque in rete che, se si parte direttamente dalla versione 4.0 di tutti i boot camp, non dovrebbero esserci problemi. Personalmente però non sono riuscito a testare questo scenario, perché quando ho provato a rimuoverli il sistema è diventato instabile e allora ho preferito un wipe completo ed effettuare l'installazione da zero.&lt;/p&gt; &lt;p&gt;Pertanto, ho masterizzato un DVD con la ISO di Windows 8 Enterprise (il boot da USB su Mac è abbastanza una chimera) e ho iniziato il processo di installazione clean. A chi dovesse accingersi a questa operazione raccomando, nel caso in cui non si abbia un altro pc a disposizione, di copiare preventivamente su un'unità esterna i driver Boot Camp 4.0. Questo perché, una volta completata l'installazione, &lt;strong&gt;Windows 8 non riconosce praticamente alcuna periferica di rete&lt;/strong&gt;, e pertanto è necessario averli in locale altrimenti rischiate di andare un po' in difficoltà.&lt;/p&gt; &lt;p&gt;La buona notizia, però, è che questa volta tutto funziona correttamente, le periferiche vengono riconosciute senza problemi (trackpad compreso). Anche Easy Transfer, in fase di ripristino, funziona correttamente e mi sono ritrovato in breve tempo con tutti i miei dati, sebbene con un interminabile elenco di applicazioni da reinstallare. Un  paio di note:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Se sviluppate applicazioni per Windows Phone, vi consiglio di seguire &lt;a href="http://blogs.msdn.com/b/astebner/archive/2012/02/29/10274694.aspx"&gt;questi passaggi&lt;/a&gt; per installare l'SDK, e di aggiornare, come consigliato, anche alla release 7.1.1.&lt;/li&gt; &lt;li&gt;Se volete accedere a dei vecchi backup di Windows 7 e diventate matti cercando il restore, in Windows 8 questo tool si chiama &lt;strong&gt;Windows 7 File Recovery&lt;/strong&gt; (grazie &lt;a href="http://blogs.aspitalia.com/sm15455/"&gt;Stefano&lt;/a&gt; per la dritta!)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Ciao!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Windows_8/" rel="tag"&gt;Windows 8&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Client/" rel="tag"&gt;Windows Client&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2777/Windows-MacBook-Esperienza.aspx"&gt;&lt;em&gt;Windows 8 su MacBook Pro, la mia esperienza&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Misc, Windows 8, Windows Client</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2777/Windows-MacBook-Esperienza.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2777/Windows-MacBook-Esperienza.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2777.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2777</trackback:ping></item><item><title>WinRT e l&amp;#39;accesso alla rete</title><link>http://blogs.aspitalia.com/cradle/post2772/WinRT-Accesso-Rete.aspx</link><pubDate>Mon, 06 Aug 2012 09:04:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2772" border="0" style="width:1px; height:1px;" /&gt;&lt;p style="font-style: normal; "&gt;Premetto che, ad essere sinceri, mi sarebbe piaciuto intitolare questo post "L'accesso alla rete nelle &lt;em&gt;M..ro Style App&lt;/em&gt;", ma, &lt;a href="http://www.theverge.com/2012/8/2/3215039/microsoft-metro-name-dispute-developers"&gt;visti i tempi che corrono&lt;/a&gt;, ho preferito evitare &lt;img alt="Smile" src="http://blogs.aspitalia.com/img/cradle/windows-live-writer/021573ab2184_8490/wlemoticon-smile_2.png"/&gt;. Resta il fatto che la &lt;strong&gt;gestione della connettività&lt;/strong&gt; è uno degli argomenti in cui le applicazioni per Windows 8 si differenziano di più rispetto al mondo del desktop.&lt;/p&gt; &lt;p style="font-style: normal; "&gt;Quando realizziamo un'applicazione Windows 8, infatti, dobbiamo sempre avere bene in mente che il target hardware si è allargato, arrivando a comprendere device come i tablet che, tipicamente, possono essere usati in mobilità. Si tratta di un contesto in cui la disponibilità della connessione ad internet non può essere ritenuta costante e affidabile come quella di una WiFi casalinga o di una LAN. E noi sviluppatori dobbiamo in qualche modo &lt;strong&gt;tenerne conto&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;C'è una serie di sfide in più allora da affrontare, che vanno dalla semplice gestione degli errori sul canale di comunicazione (che magari già implementiamo nelle applicazioni di oggi), alla periodica verifica della disponibilità della connessione di rete, fino ad arrivare a funzionalità avanzate, quali magari consentire la fruizione di contenuti in modalità offline o &lt;em&gt;"tarare"&lt;/em&gt; la qualità del contenuto scaricato a seconda della tipologia della connessione stessa (3G o WiFi, tanto per dirne una).&lt;/p&gt; &lt;p style="font-style: normal; "&gt;Nelle app che il team di &lt;strong&gt;&lt;a href="http://www.5dlabs.it/"&gt;5DLabs.it&lt;/a&gt;&lt;/strong&gt; ha realizzato, abbiamo tenuto in grande considerazione proprio questi aspetti: se, ad esempio, &lt;a href="http://apps.microsoft.com/webpdp/en-US/app/aspitalia-com/044031e2-b907-4377-85b9-c52603fde8d6"&gt;nell'app di ASPItalia.com&lt;/a&gt; "pinnate" un contenuto nella Start Page, potete leggerlo &lt;strong&gt;in tutte le condizioni di connettività&lt;/strong&gt;, anche senza rete, perché è giusto che un articolo che l'utente ha reputato importante sia sempre disponibile.&lt;/p&gt; &lt;p&gt;&lt;span style="font-style: normal; "&gt;In ambito enterprise, poi, l'argomento diventa di &lt;strong&gt;importanza critica&lt;/strong&gt;: gestire questa tipologia di problematiche può fare la differenza tra il mettere in piedi un'applicazione &lt;/span&gt;&lt;em&gt;instabile&lt;/em&gt; e una che fa il suo dovere in ogni condizione. Ecco perché, d'accordo con &lt;a href="http://www.5dlabs.it/people"&gt;i miei compagni di merende&lt;/a&gt;, ho pensato che meritasse uno slot &lt;a href="http://www.developerconference.it/events/2012/agenda.aspx" style="font-style: normal; "&gt;nell'agenda&lt;/a&gt; della prossima &lt;strong style="font-style: normal; "&gt;&lt;a href="http://www.developerconference.it/events/2012/default.aspx"&gt;Windows Developer Conference&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt; &lt;p style="font-style: normal; "&gt;Se queste tematiche vi interessano, se il vostro target è quello del mondo enterprise/business, il mio consiglio è quello di non lasciarvi sfuggire questa conferenza, visto l'altissimo livello degli &lt;a href="http://www.developerconference.it/events/2012/speakers.aspx"&gt;speaker coinvolti&lt;/a&gt; e l'attualità dei contenuti trattati che, pur se incentrati su Windows 8, spaziano anche nelle direzioni di C#, di sviluppo asincrono, di Azure, ecc... &lt;/p&gt; &lt;p style="font-style: normal; "&gt;Le date sono i prossimi &lt;strong&gt;23 e 24 ottobre&lt;/strong&gt;, la location è &lt;a href="http://www.developerconference.it/events/2012/location.aspx"&gt;in centro a Milano&lt;/a&gt;, &lt;a href="http://www.developerconference.it/events/2012/register.aspx"&gt;&lt;strong&gt;fino al 3 settembre c'è un super early bird di soli 499,00 Euro&lt;/strong&gt;&lt;/a&gt;. Secondo me ne vale la pena!&lt;/p&gt; &lt;p style="font-style: normal; "&gt;Ciao!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Metro/" rel="tag"&gt;Metro&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_8/" rel="tag"&gt;Windows 8&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Azure/" rel="tag"&gt;Windows Azure&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Client/" rel="tag"&gt;Windows Client&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/WinJS/" rel="tag"&gt;WinJS&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/WinRT/" rel="tag"&gt;WinRT&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2772/WinRT-Accesso-Rete.aspx"&gt;&lt;em&gt;WinRT e l&amp;#39;accesso alla rete&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Architettura, Metro, Windows 8, Windows Azure, Windows Client, WinJS, WinRT</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2772/WinRT-Accesso-Rete.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2772/WinRT-Accesso-Rete.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2772.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2772</trackback:ping></item><item><title>Un libro davvero bello su Visual Studio LightSwitch</title><link>http://blogs.aspitalia.com/cradle/post2757/Libro-Davvero-Bello-Visual-Studio-LightSwitch.aspx</link><pubDate>Wed, 28 Mar 2012 17:49:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2757" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Un mio cliente ha recentemente iniziato ad utilizzare &lt;strong&gt;Visual Studio LightSwitch&lt;/strong&gt; per la realizzazione di alcuni software che richiedevano tempi di sviluppo estremamente ridotti. Si tratta di una piattaforma davvero produttiva, alcuni click, poche righe di codice e il tuo gestionale è lì che gira. Ma come tutti i software RAD, quando qualcuno ti chiede "ma non si potrebbe modificare X?" o "perchè non cambiamo Y in Z?" iniziano i veri problemi, perchè bisogna conoscere a fondo il tool e cosa ti permette di fare, quali sono i limiti e come funzionano gli internals.&lt;/p&gt; &lt;p&gt;&lt;span style="font-weight: normal; "&gt;Allora mi sono rivolto a un esperto, o meglio ho letto il libro &lt;/span&gt;&lt;strong&gt;&lt;a href="http://www.amazon.it/Microsoft-Visual-Studio-LightSwitch-Unleashed/dp/0672335530/ref=sr_1_2?ie=UTF8&amp;amp;qid=1332957083&amp;amp;sr=8-2"&gt;Visual Studio LightSwitch Unleashed&lt;/a&gt;&lt;/strong&gt;, edito da SAMS,&amp;nbsp;del nostro &lt;a href="http://community.visual-basic.it/Alessandro/default.aspx"&gt;Alessandro Del Sole&lt;/a&gt;. Arrivo subito al dunque: vi interessa LightSwitch? allora è un riferimento a mio modo di vedere &lt;strong&gt;assolutamente imprescindibile&lt;/strong&gt;, per &lt;strong&gt;completezza&lt;/strong&gt;, &lt;strong&gt;chiarezza espositiva &lt;/strong&gt;e &lt;strong&gt;qualità degli esempi&lt;/strong&gt;. In questo testo Alessandro prende letteralmente per mano il lettore, supportandolo già nelle primissime fasi dell'installazione e dell'esplorazione dell'inedita interfaccia di Lightswitch. Si impara a costruire la prima applicazione a colpi di drag'n drop, poi si scrive un po' di codice, e si va avanti così, con la complessità che aumenta in maniera graduale, senza mai spiazzarci, ma allo stesso tempo esplorando LightSwitch in tutti i suoi meandri. Le &lt;strong&gt;tematiche avanzate non mancano&lt;/strong&gt; infatti, e sono in grado di soddisfare anche esigenze più "spinte": tra gli altri, si parla di modello di applicazione, di come integrarla con custom control Silverlight, di come estendere il framework e aggiungere report.&lt;/p&gt; &lt;p&gt;&lt;span style="font-weight: normal; "&gt;Insomma, è un libro che rappresenta un bel valore aggiunto &lt;/span&gt;&lt;strong&gt;per qualsiasi sviluppatore&lt;/strong&gt; che usi Visual Studio LightSwitch e, lasciatemelo dire con una punta di campanilismo, sono felice che a scriverlo sia stato un italiano: ho avuto modo di scrivere libri in inglese in passato e so, per esperienza personale, che non è per nulla semplice. Quindi complimenti doppi da parte mia!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2757/Libro-Davvero-Bello-Visual-Studio-LightSwitch.aspx"&gt;&lt;em&gt;Un libro davvero bello su Visual Studio LightSwitch&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Misc, Silverlight, Visual Studio, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2757/Libro-Davvero-Bello-Visual-Studio-LightSwitch.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2757/Libro-Davvero-Bello-Visual-Studio-LightSwitch.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2757.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2757</trackback:ping></item><item><title>Visual Studio 11 beta: le novit&amp;#224; di ASP.NET MVC 4 e ASP.NET Web Pages 2.0</title><link>http://blogs.aspitalia.com/cradle/post2749/Visual-Studio-11-Beta-Novita-ASP.NET-MVC-ASP.NET-Web.aspx</link><pubDate>Fri, 02 Mar 2012 09:05:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2749" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;Se ASP.NET MVC 3 ha rappresentato il consolidamento di un framework oramai maturo e idoneo a essere utilizzato in scenari avanzati, con la nuova versione, &lt;strong&gt;ASP.NET MVC 4&lt;/strong&gt; introduce una serie di migliorie volte a supportare nativamente una serie di contesti, quali ad esempio la realizzazione di servizi REST e lo sviluppo di applicazioni web mobile, in cui l'utilizzo di ASP.NET MVC risulta molto comodo e naturale.&lt;/p&gt; &lt;p&gt;La prima grossa novità è rappresentata da &lt;strong&gt;WebAPI&lt;/strong&gt;, ossia un'estensione tramite la quale possiamo realizzare servizi di tipo &lt;strong&gt;REST&lt;/strong&gt; scrivendo davvero poco codice: ereditando dalla nuova classe ApiController, infatti, il framework predispone una serie di regole di routing basate su convenzioni di naming; le action, che corrispondono alle operation dei servizi, sono così direttamente invocabili da un client, che può essere javascript, Windows Phone, o altro, e restituiscono dati in formato &lt;strong&gt;JSON &lt;/strong&gt;o &lt;strong&gt;XML&lt;/strong&gt;. L'aspetto interessante è che questi particolari controller vengono comunque eseguiti dall'infrastruttura di ASP.NET MVC, e pertanto possono avvalarsi di funzionalità già presenti quali &lt;strong&gt;Action Filter&lt;/strong&gt;, &lt;strong&gt;Model Binder&lt;/strong&gt; e &lt;strong&gt;Routing&lt;/strong&gt;. Eventualmente, ma non è un requisito, è possibile sfruttare questa tipologia di servizi per realizazre Single Page Application, applicazioni cioè costituite da una singola pagina, che modifica il suo contenuto in maniera dinamica, comportantosi insomma come&lt;strong&gt; un vero e proprio smart client&lt;/strong&gt;. In questo senso è anche presente un supporto sperimentale in ASP.NET MVC sotto forma di un particolare template.&lt;/p&gt; &lt;p&gt;Parlando di template, anche in questo senso sono state apportate delle migliorie, volte soprattutto a rendere più moderni quelli esistenti (che ora sono tutti in formato HTML 5 standard) e a supportare sin da subito i &lt;strong&gt;dispositivi mobile&lt;/strong&gt;. In particolare, &lt;strong&gt;jQuery Mobile&lt;/strong&gt; è incluso di default nei template di progetto, ed è ora più semplice realizzare view specifiche per i dispositivi. E' stato introdotto anche il concetto di &lt;strong&gt;DisplayMode&lt;/strong&gt;, tramite il quale identificare view differenti in base alla tipologia del browser. Anche Razor è cresciuto in questa nuova versione, aggiungendo funzionalità per rendere più sintetica l'inclusione degli script.&lt;/p&gt; &lt;p&gt;Sul fronte &lt;strong&gt;ASP.NET Web Pages 2.0&lt;/strong&gt;, invece, oltre a molto di quanto già detto per ASP.NET MVC (Razor,template mobile) si aggiunge anche il supporto alle API di &lt;strong&gt;un gran numero&lt;/strong&gt; di servizi esterni, utili ad esempio per la gestione dell'autenticazione, che includono OAuth, OpenID e le nuove API di Facebook, Twitter, ecc. E inoltre presente il nuovo helper &lt;strong&gt;Map&lt;/strong&gt;, che consente di integrare con semplicità mappe di Google, Bing o Yahoo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.5/" rel="tag"&gt;.NET Framework 4.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.5/" rel="tag"&gt;ASP.NET 4.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Metro/" rel="tag"&gt;Metro&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio_2012/" rel="tag"&gt;Visual Studio 2012&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/WebMatrix/" rel="tag"&gt;WebMatrix&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_8/" rel="tag"&gt;Windows 8&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Client/" rel="tag"&gt;Windows Client&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2749/Visual-Studio-11-Beta-Novita-ASP.NET-MVC-ASP.NET-Web.aspx"&gt;&lt;em&gt;Visual Studio 11 beta: le novit&amp;#224; di ASP.NET MVC 4 e ASP.NET Web Pages 2.0&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework, .NET Framework 4.5, ASP.NET 4.5, Metro, Visual Studio 2012, WebMatrix, Windows 8, Windows Client</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2749/Visual-Studio-11-Beta-Novita-ASP.NET-MVC-ASP.NET-Web.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2749/Visual-Studio-11-Beta-Novita-ASP.NET-MVC-ASP.NET-Web.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2749.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2749</trackback:ping></item><item><title>I miei Community Days 2012...</title><link>http://blogs.aspitalia.com/cradle/post2744/Community-Days-2012.aspx</link><pubDate>Mon, 20 Feb 2012 08:35:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2744" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;...sono stati semplicemente &lt;strong&gt;devastanti&lt;/strong&gt;, ho avuto bisogno di un paio di giorni per riprendermi, ma la soddisfazione per come siano andate le cose, per il successo, per la gente entusiasta, ecc. ecc. è stata enorme e ripaga ampiamente tutta la fatica degli ultimi mesi. Per la prima volta, nella mia breve carriera da speaker, ho fatto una doppietta e ho tenuto due sessioni, una su &lt;strong&gt;jQuery Mobile&lt;/strong&gt; e su &lt;strong&gt;WinJS&lt;/strong&gt;, che mi hanno impegnato alla grande, complici anche alcuni problemini tecnici (il mio MacBook faceva un po' a pugni con il maxischermo di sala 3-4, grazie &lt;a href="http://blogs.ugidotnet.org/pape/Default.aspx"&gt;Andrea&lt;/a&gt;). Per me è stato un onore parlare di questi argomenti, perché, vuoi o non vuoi, rappresentano l'&lt;strong&gt;evoluzione/rivoluzione&lt;/strong&gt; di ciò che saranno le applicazioni desktop e web dei prossimi anni, mica pizza e fichi! Ci credo molto, ed è il motivo per cui sto investendo tantissimo in quest'ambito: il mondo dei device, siano essi &lt;strong&gt;tablet&lt;/strong&gt;, &lt;strong&gt;smartphone&lt;/strong&gt; o &amp;quot;&lt;strong&gt;ibridi&lt;/strong&gt;&amp;quot;, sarà quello con cui ci misureremo sempre più di frequente.&lt;/p&gt; &lt;p&gt;L'impressione è che comunque siano piaciute, ho ricevuto tante domande al termine dei talk e questa è una grande soddisfazione, la speranza è che possano costituire degli spunti interessanti che un giorno si traducano in codice di produzione.&lt;/p&gt; &lt;p&gt;Tutto il materiale, slide e demo (anche quelle che per motivi di tempo non sono riuscito a mostrarvi) sono online sia &lt;a href="http://www.aspitalia.com/eventi/35/Community-Days-2012-Milano.aspx"&gt;qui su ASPItalia&lt;/a&gt; che sul &lt;a href="http://www.communitydays.it/events/communitydays-2012/"&gt;sito dei Community Days&lt;/a&gt;. Non mi resta davvero altro da dire, se non un sonoro grazie a tutti, organizzatori, speaker e soprattutto alle oltre 800 persone che si sono iscritte e sono state al Microsoft Innovation Campus con noi per questi due giorni: con i Community Days 2012 abbiamo alzato la barra ad un livello superiore, e il merito è di tutti, nessuno escluso!&lt;/p&gt; &lt;p&gt;Ci si vede ai &lt;a href="http://www.communitydays.it/events/communitydaysbari-2012/"&gt;prossimi appuntamenti&lt;/a&gt;, e soprattutto ci si legge su queste pagine!&lt;/p&gt; &lt;p&gt;Aloha!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_MVC/" rel="tag"&gt;ASP.NET MVC&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Community_Days_2012/" rel="tag"&gt;Community Days 2012&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/HTML5/" rel="tag"&gt;HTML5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/JavaScript/" rel="tag"&gt;JavaScript&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/jQuery/" rel="tag"&gt;jQuery&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_8/" rel="tag"&gt;Windows 8&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Client/" rel="tag"&gt;Windows Client&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2744/Community-Days-2012.aspx"&gt;&lt;em&gt;I miei Community Days 2012...&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Misc, .NET Framework, .NET Framework 4.0, ASP.NET, ASP.NET 4.0, ASP.NET MVC, Community Days 2012, HTML5, JavaScript, jQuery, Windows 8, Windows Client</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2744/Community-Days-2012.aspx</guid><slash:comments>2</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2744/Community-Days-2012.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2744.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2744</trackback:ping></item><item><title>PhoneGap e Titanium, esiste davvero il write once run anywhere su mobile?</title><link>http://blogs.aspitalia.com/cradle/post2730/PhoneGap-Titanium-Esiste-Davvero-Write-Once-Run-Anywhere.aspx</link><pubDate>Thu, 12 Jan 2012 08:30:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2730" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;Ultimamente si fa davvero un gran parlare di framework che consentono di sviluppare sulle varie piattaforme mobile, &lt;strong&gt;senza dover necessariamente scrivere codice nativo&lt;/strong&gt;. Tra queste, probabilmente la più famosa è &lt;strong&gt;&lt;a href="http://phonegap.com/"&gt;PhoneGap&lt;/a&gt;&lt;/strong&gt;, ultimamente davvero non passa giorno senza che venga nominata da qualche parte, ma anche &lt;a href="http://www.appcelerator.com/"&gt;Appcelerator Titanium&lt;/a&gt;, seppur meno menzionato, recita in un ruolo di protagonista nell'ambito di questo genere di prodotti. Alcune settimane fa, con &lt;a href="http://www.5dlabs.it/"&gt;&lt;strong&gt;5DLabs&lt;/strong&gt;&lt;/a&gt; abbiamo fatto una serie di studi di fattibilità in merito per conto di un cliente, e ho pensato di riportarvi un po' l'esperienza maturata. &lt;/p&gt; &lt;p&gt;Ma andiamo con ordine e spendiamo qualche parola su PhoneGap e Titanium per capire un po' meglio di cosa stiamo parlando. Iniziamo col dire che ambedue questi servono per sviluppare &lt;strong&gt;applicazioni native&lt;/strong&gt;, pronte cioè a essere distribuite tramite &lt;strong&gt;AppStore&lt;/strong&gt;, &lt;strong&gt;Android Market&lt;/strong&gt;, &lt;strong&gt;Marketplace &lt;/strong&gt;di Window Phone, ecc.ecc.. Entrambi utilizzano &lt;strong&gt;Javascript&lt;/strong&gt; come linguaggio di sviluppo, ma con due filosofie profondamente diverse. In ogni caso, non possono prescindere, ovviamente, dagli SDK nativi per queste piattaforme. Conseguenza: se dovete sviluppare per iOS vi serve comunque un &lt;strong&gt;Mac con OSX&lt;/strong&gt;.&lt;/p&gt; &lt;h3&gt;&lt;/h3&gt; &lt;h3&gt;PhoneGap&lt;/h3&gt; &lt;p&gt;PhoneGap è un framework di sviluppo &lt;strong&gt;ibrido&lt;/strong&gt;, nel senso che consente di realizzare App native per un &amp;#xa0;gran numero di piattaforme (sono supportate tutte le più diffuse, &lt;a href="http://phonegap.com/about/features/"&gt;come riportato qui&lt;/a&gt;) utilizzando &lt;strong&gt;HTML5 + CSS3 + Javascript&lt;/strong&gt;. Ok, ma come funziona nella pratica? Un'applicazione PhoneGap fondamentalmente è costituita da un'insieme di pagine eseguite all'interno di &lt;strong&gt;un controllo browser&lt;/strong&gt;, pagine il cui codice Javascript sostituisce&lt;strong&gt; in tutto e per tutto&lt;/strong&gt; quello che scriveremmo in Objective-C, Java o C#. Dovete invocare un servizio web? Chiamata AJAX, magari con &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;. Dovete realizzare una form di input di dati? Vai di styling CSS, o &lt;a href="http://jquerymobile.com/"&gt;jQuery Mobile&lt;/a&gt; o &lt;a href="http://www.sencha.com/products/touch"&gt;Sencha Touch&lt;/a&gt; che dir si voglia.&lt;/p&gt; &lt;p&gt;Ok, ma allora a cosa serve il framework? Beh, PhoneGap, oltre ad una serie di template di progetto per i vari ambienti di sviluppo, fondamentalmente è costituito da una libreria javascript che fa da &lt;strong&gt;bridge&lt;/strong&gt; tra il nostro codice in pagina e le funzionalità native del telefono, dandoci di fatto la possibilità di accedere a funzionalità native del sistema e del dispositivo, come i &lt;strong&gt;contatti&lt;/strong&gt;, il &lt;strong&gt;GPS&lt;/strong&gt; o la &lt;strong&gt;fotocamera&lt;/strong&gt;.&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;Punti a favore&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Sicuramente il fatto che &lt;strong&gt;non dobbiamo praticamente imparare nulla&lt;/strong&gt;, il Javascript è quello che abbiamo sempre usato, i framework anche, stesso discorso per i &lt;strong&gt;tool&lt;/strong&gt; (e scusate se è poco!). Il passo per convertire un'app web in una nativa è davvero brevissimo. Inoltre l'enorme numero di dispositivi supportati, praticamente tutti gli smartphone moderni, è sicuramente un fattore non trascurabile. In buona sostanza, &lt;strong&gt;ad un costo quasi zero&lt;/strong&gt; siamo in grado di sviluppare un'app nativa, anche considerando la natura assolutamente gratuita di questo prodotto. Non male eh? Purtroppo però non finisce qui.&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;Svantaggi&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Diversi aspetti mi hanno deluso di PhoneGap, che presenta dei limiti davvero pesanti a causa dei quali non mi sono sentito di consigliarne l'adozione. In particolare, in ordine sparso:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Siamo fondamentalmente costretti a &lt;strong&gt;reinventare la ruota&lt;/strong&gt;: possiamo in buona sostanza&lt;strong&gt; dimenticarci tutti i controlli nativi&lt;/strong&gt; per la piattaforma, con il risultato che le applicazioni &lt;strong&gt;perdono&lt;/strong&gt; completamente il look &amp;amp; feel tipico del dispositivo su cui girano. Esistono alcuni plugin che supportano il rendering di 3 o 4 controlli nativi (AFAIK, TabBar, Toolbar, ActionSheet e StatusBar, e solo su iPhone), ma in questo modo si perde la portabilità. Ne vale davvero la pena, allora? &lt;/li&gt;&lt;li&gt;Conseguenza diretta del punto precedente, è che la nostra app &lt;strong&gt;rischia di non essere accettata&lt;/strong&gt;. Alcuni reviewers sono molto attenti, ad esempio, al rispetto delle guidelines della UX. Fatevi un giro su google e cercate &amp;quot;PhoneGap app rejected&amp;quot; e troverete davvero tanti casi. &lt;/li&gt;&lt;li&gt;Generalmente il funzionamento dell'applicazione è &lt;strong&gt;meno responsivo e fluido&lt;/strong&gt; di una eventuale controparte nativa (ma questo, invero, dipende dalla bontà del browser). &lt;/li&gt;&lt;li&gt;Il codice è &lt;strong&gt;interpretato&lt;/strong&gt;, niente compilazione. Quindi gli unici errori sono a &lt;strong&gt;runtime&lt;/strong&gt;. Già così non è il massimo, ma, more than worse, ... &lt;/li&gt;&lt;li&gt;..il &lt;strong&gt;debug&lt;/strong&gt;, come modernamente lo intendiamo, è praticamente &lt;strong&gt;impossibile&lt;/strong&gt;. Scordatevi di mettere un breakpoint nel codice e di procedere step by step. Molti consigliano di eseguire l'applicazione su un browser tradizionale e debuggare da lì, ma a me sembra un timido palliativo, il debug lo &lt;strong&gt;voglio&lt;/strong&gt; eseguire dal telefono o dal tablet! Alla fine vi toccherà tornare all'antico, con un sacco di begli &lt;strong&gt;alert&lt;/strong&gt; sparsi qua e là nel codice. &lt;/li&gt;&lt;li&gt;Per alcune funzionalità (es. riproduzione video) vi toccherà comunque imparare il codice nativo . &lt;/li&gt;&lt;li&gt;PhoneGap &lt;strong&gt;non&lt;/strong&gt; è Write Once Run Anywhere, semplicemente perchè se volete supportare n dispositivi avrete&lt;strong&gt; n progetti&lt;/strong&gt;, magari ognuno la &lt;strong&gt;copia&lt;/strong&gt; dell'altro, ma sempre n progetti da &lt;strong&gt;manutenere&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Appcelerator Titanium&lt;/h3&gt; &lt;p&gt;Iniziamo dicendo che Titanium è un &lt;strong&gt;prodotto commerciale&lt;/strong&gt;, si paga una fee mensile per utilizzarlo e sono previsti diversi livelli di abbonamento (tra cui uno &amp;quot;community&amp;quot; gratuito) che si distinguono, oltre che per il supporto, anche in base alle funzionalità attive. Il linguaggio utilizzato è sempre Javascript, ma l'approccio rispetto a PhoneGap è &lt;strong&gt;sensibilmente differente&lt;/strong&gt;: il codice che scriviamo, infatti, questa volta non ha nulla a che vedere con HTML, CSS o sviluppo Web in generale, bensì si appoggia ad un &lt;strong&gt;object model proprietario&lt;/strong&gt; che wrappa gli oggetti nativi delle varie piattaforme. Il risultato è che il progetto Titanium &lt;strong&gt;genera codice nativo&lt;/strong&gt;, con un layer che ne consente l'invocazione via Javascript.&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;Punti a favore&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Titanium ha un &lt;strong&gt;IDE proprietario&lt;/strong&gt;, basato su Eclipse. Supporta l'autocompletamento del codice e ha un &lt;strong&gt;debugger integrato&lt;/strong&gt;, basato su Firebug. Quando creiamo un nuovo progetto ci viene chiesto quali piattaforme supportare come target, poi in fase di compilazione scegliamo su quale compilare. Corollario: &lt;strong&gt;il progetto resta uno solo&lt;/strong&gt;, non dobbiamo manutenerne n copie, molto più vicino all'idea di write once run anywhere. &lt;/p&gt; &lt;p&gt;Anche qui, comunque, è richiesta la presenza degli SDK ufficiali, quindi se vogliamo sviliuppare su iOS non abbiamo scelta e dobbiamo lavorare su OSX. Il risultato finale, comunque, è davvero notevole, e soprattutto &lt;strong&gt;indistinguibile&lt;/strong&gt; da una qualsiasi app realizzata con XCode o Android SDK + Eclipse. Ovviamente &lt;strong&gt;non tutti gli oggetti&lt;/strong&gt; di Titanium hanno corrispondenti sia su iOS che su Android, e pertanto alle volte è necessario qualche &amp;quot;&lt;em&gt;if (platform == iOS)&lt;/em&gt;&amp;quot;, ma alla fine non è drammatico.&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;Problemi&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Il limite principale di Titanium è che, al momento, &lt;strong&gt;supporta esclusivamente Android e iOS&lt;/strong&gt;. Niente Windows Phone, pertanto. Però può essere comunque interessante valutarlo se il nostro team è già skillato sulla piattaforma Microsoft e vogliamo comunque produrre applicazioni per questi altri due target.&lt;/p&gt; &lt;p&gt;Da un punto di vista dell'utilizzo, il primo ostacolo in cui mi sono imbattuto è &lt;strong&gt;l'assenza&lt;/strong&gt; di un qualsiasi &lt;strong&gt;editor grafico&lt;/strong&gt;, o comunque di un ausilio visuale per lo sviluppo di interfacce. In pratica siamo costretti a fare tutto da codice, istanziando controlli, valorizzandone le proprietà, aggiungendoli ad un controllo contenitore, e così via. Sicuramente è un approccio che si adatta non proprio bene a interfacce complesse e che rende &lt;strong&gt;molto difficoltosa&lt;/strong&gt; l'interazione con un grafico.&lt;/p&gt; &lt;p&gt;L'aspetto che però mi è piaciuto meno, è la &lt;strong&gt;scarsa &lt;strike&gt;estendibilità&lt;/strike&gt; flessibilità&lt;/strong&gt; del framework, sicuramente uno dei limiti più difficilmente superabili dell'architettura. Nel mio caso, ad esempio, avevo bisogno di una ScrollView (i &amp;quot;pallini&amp;quot; che rappresentano la paginazione della springboard di iOS, per capirci) in direzione verticale; Titanium ne propone solo una orizzontale e sono stato costretto a parecchi hack per ottenerla, sebbene invece sia assolutamente esistente in XCode. In generale questa mancanza di flessibilità può rappresentare un problema non da poco, e dobbiamo essere pronti a rivedere le interfacce in base alle possibilità del framework.&lt;/p&gt;&lt;p&gt;[EDIT]Come mi segnala &lt;a href="http://blogs.ugidotnet.org/Box/Default.aspx"&gt;Alessandro Ghizzardi&lt;/a&gt;, in realtà, &lt;a href="http://www.slideshare.net/omorandi/extending-appcelerator-titanium-mobile-through-native-modules"&gt;è possibile realizzare dei wrapper&lt;/a&gt; di funzionalità native ed esporle tramite Javascript in Titanium. Ovviamente, però, in questo caso si ha la necessità di scrivere codice in Objective-C e/o Java (a seconda della piattaforma), quindi le skill dobbiamo averle, però sicuramente è una feature che eleva di molto il livello del prodotto.&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;Conclusione&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Entrambi i prodotti sono &lt;strong&gt;ben lungi&lt;/strong&gt; dall'essere perfetti. PhoneGap, secondo me, dà come valore aggiunto il riutilizzo delle skill, ma &lt;strong&gt;ad un costo non indifferente&lt;/strong&gt;, ossia tutte le problematiche che ho citato. Pertanto lo vedo magari adatto ad un progetto &lt;strong&gt;estemporaneo&lt;/strong&gt; se non vogliamo investire su una piattaforma nel lungo periodo, per il resto davvero mi lascia molto scettico.&lt;/p&gt; &lt;p&gt;Con Titanium la storia è differente: non nego che, sebbene sulle prime mi abbia lasciato un po' spaesato, l'impressione che ne ho tratto è quella di un &lt;strong&gt;buon prodotto&lt;/strong&gt;, con alcuni limiti oggettivi che lo rendono poco &amp;quot;snello&amp;quot; in progetti di alto livello. Però davvero non è male, provate a compilare &lt;a href="https://github.com/appcelerator/KitchenSink"&gt;Kitchen Sink&lt;/a&gt; per farvi un'idea. Il framework e il modello a oggetti &lt;strong&gt;dobbiamo comunque impararlo&lt;/strong&gt;, però, quindi non ci sono grandi vantaggi se poi puntiamo ad una sola piattaforma delle due disponibili.&lt;/p&gt; &lt;p&gt;Per quanto mi riguarda, &lt;strong&gt;la prima opzione resta la piattaforma nativa&lt;/strong&gt;, per tutta una serie di ragioni: ottimizzazione e controllo del codice, debug, facilità nel reperire documentazione, informazioni e componenti di terze parti, e potrei continuare... Sono aspetti che fanno la differenza, e che secondo me già nel medio periodo ripagano l'investimento sostenuto per acquisire le skill necessarie, investimento che, da professionisti, probabilmente è &lt;strong&gt;uno dei più futuribili&lt;/strong&gt; che oggi possiamo fare.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/HTML5/" rel="tag"&gt;HTML5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/JavaScript/" rel="tag"&gt;JavaScript&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/jQuery/" rel="tag"&gt;jQuery&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Metro/" rel="tag"&gt;Metro&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Phone/" rel="tag"&gt;Windows Phone&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Phone_7/" rel="tag"&gt;Windows Phone 7&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Phone_7.1/" rel="tag"&gt;Windows Phone 7.1&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Phone_7.5/" rel="tag"&gt;Windows Phone 7.5&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2730/PhoneGap-Titanium-Esiste-Davvero-Write-Once-Run-Anywhere.aspx"&gt;&lt;em&gt;PhoneGap e Titanium, esiste davvero il write once run anywhere su mobile?&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Misc, HTML5, JavaScript, jQuery, Metro, Windows Phone, Windows Phone 7, Windows Phone 7.1, Windows Phone 7.5</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2730/PhoneGap-Titanium-Esiste-Davvero-Write-Once-Run-Anywhere.aspx</guid><slash:comments>10</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2730/PhoneGap-Titanium-Esiste-Davvero-Write-Once-Run-Anywhere.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2730.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2730</trackback:ping></item><item><title>WPC 2011: Cosa mi/ci/vi aspetta!</title><link>http://blogs.aspitalia.com/cradle/post2721/WPC-2011-Aspetta.aspx</link><pubDate>Mon, 14 Nov 2011 07:01:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2721" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;p&gt;Quest'anno sono davvero orgoglioso di essere riuscito a salire a bordo della&lt;strong&gt; più importante conference IT italiana&lt;/strong&gt;: è infatti per me un grande onore essere uno degli speaker di WPC 2011, dove terrò una sessione nella giornata del 23 (poco prima di Ibraaaaaa!!).&lt;/p&gt;&lt;p&gt;Di cosa parlerò? Beh, di un argomento che, con il passare degli anni e delle versioni, mi appassiona sempre di più, tanto da averci scritto un libro e da non smettere di consigliarlo a varie aziende presso le quali collaboro: ovviamente si tratta di &lt;strong&gt;ASP.NET MVC&lt;/strong&gt;, e in particolare delle possibilità di &lt;strong&gt;estensione &lt;/strong&gt;e &lt;strong&gt;customizzazione &lt;/strong&gt;che ci offre.&lt;/p&gt;&lt;p&gt;Secondo me, infatti, al di là delle migliorie sul view engine, i global filters, ecc. ecc., la&lt;strong&gt; vera carta vincente &lt;/strong&gt;di ASP.NET MVC è proprio costituita dalla sua &lt;strong&gt;architettura&lt;/strong&gt;, pluggabile in diversi punti, tanto da riuscire a piegarla alle nostre esigenze particolari davvero con poco sforzo e con risultati sorprendenti, soprattutto dal punto di vista della semplicità e della pulizia del codice. Certo, si tratta di feature che sicuramente sfuggono ad una prima occhiata, fornendoci quindi l'errata impressione di un framework che, sì, dà controllo assoluto sul markup, ma che allo stesso tempo sembra essere verboso e ripetitivo (&amp;quot;sì, ma dove sono gli user control? e i datasource??).&lt;/p&gt;&lt;p&gt;Eppure, con un approccio diverso, magari giusto un pelo più ragionato, e con gli strumenti giusti, possiamo davvero scatenare&lt;strong&gt; a tutta forza&lt;/strong&gt; la potenza di ASP.NET MVC. Se riuscite, fate un salto ad Assago il 23 e ne parleremo insieme! E dopo... Ibrahimovic vs. Messi...&lt;/p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Architettura/" rel="tag"&gt;Architettura&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_MVC/" rel="tag"&gt;ASP.NET MVC&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Cache/" rel="tag"&gt;Cache&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework_4.1/" rel="tag"&gt;Entity Framework 4.1&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/jQuery/" rel="tag"&gt;jQuery&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Pattern/" rel="tag"&gt;Pattern&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2721/WPC-2011-Aspetta.aspx"&gt;&lt;em&gt;WPC 2011: Cosa mi/ci/vi aspetta!&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework, .NET Framework 4.0, Architettura, ASP.NET MVC, Cache, Entity Framework 4.1, jQuery, Pattern</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2721/WPC-2011-Aspetta.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2721/WPC-2011-Aspetta.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2721.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2721</trackback:ping></item><item><title>CDays10, the day after: ringraziamenti, precisazioni, tricchettracc e bombamman</title><link>http://blogs.aspitalia.com/cradle/post2671/CDays10-The-Day-After-Ringraziamenti-Precisazioni-.aspx</link><pubDate>Sat, 18 Dec 2010 12:17:33 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2671" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Sto scrivendo queste righe mentre sono su un treno che mi riporta in Abruzzo, dopo che Ryanair ha pensato bene di cancellare il mio volo di ieri sera (insieme a quelli di un altro migliaio di passeggeri). bah.&lt;/p&gt; &lt;p&gt;Anyway, innanzitutto volevo ringraziare tutti i partecipanti ai &lt;a href="http://www.communitydays.it/events/communitydays2010-milano.aspx" target="_blank"&gt;Community Days 2010&lt;/a&gt;, in particolar modo quelli che sono rimasti ad ascoltare la mia sessione e quella di &lt;a href="http://blogs.ugidotnet.org/pape/Default.aspx" target="_blank"&gt;Andrea&lt;/a&gt;, nonostante l'incognita della neve e della percorribilità delle strade. Non ho parole, grazie sul serio, spero che ciò che vi ho mostrato di Web Forms possa in qualche modo esservi utile e serva a ripagare la vostra pazienza! &lt;img alt="Smile" src="http://blogs.aspitalia.com/img/cradle/windows-live-writer/cd2010_b56c/wlemoticon-smile_2.png" /&gt;&lt;/p&gt; &lt;p&gt;Durante la sessione ho notato parecchio interesse, soprattutto attorno alle nuove funzionalità di &lt;strong&gt;Dynamic Data&lt;/strong&gt;, che secondo me rappresentano una vera rivoluzione nell'ambito di *come* scrivere un'applicazione web forms oggi. Mi fa piacere perchè non nascondo la mia passione per DynData, cercherò di utilizzare questo feedback anche in ottica di tuning degli script per il 2011.&lt;/p&gt; &lt;p&gt;Il medesimo interesse poi l'ho visto nella parte relativa alla &lt;strong&gt;cache&lt;/strong&gt;, peccato che &lt;strong&gt;AppFabric &lt;/strong&gt;abbia fatto le bizze e non mi abbia consentito di eseguire con successo tutte le demo che avevo preparato. Rimedierò con uno screencast al più presto, promesso! Quando parlo di &lt;em&gt;"fare le bizze"&lt;/em&gt; purtroppo intendo proprio &lt;em&gt;"fare le bizze"&lt;/em&gt;, nel senso che 10 minuti fa è bastato stoppare e riavviare il servizio perchè tutto funzionasse senza modificare una riga nel codice.. misteri sistemistici, con AppFabric siamo ancora alla versione 1.0 e magari c'è spazio ancora per qualche fix qua e là. Anyway, indagherò meglio e vi terrò aggiornati &lt;img alt="Winking smile" src="http://blogs.aspitalia.com/img/cradle/windows-live-writer/cd2010_b56c/wlemoticon-winkingsmile_2.png" /&gt;&lt;/p&gt; &lt;p&gt;Una risposta volante alla persona che mi ha chiesto della possibilità di invalidare elementi in cache in dipendenza da SQL Server: confermo che è possibile, la classe si chiama &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.caching.sqlchangemonitor.sqlchangemonitor.aspx" target="_blank"&gt;SqlChangeMonitor&lt;/a&gt; e non è altro che un wrapper della precedente &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.aspx" target="_blank"&gt;SqlDependency&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Slide e demo online prestissimo, le sto "impacchettando" or ora per spedirle a &lt;a href="http://blogs.aspitalia.com/daniele/" target="_blank"&gt;Daniele&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Sentitevi liberi di contattarmi per ogni genere di domanda, un saluto e ancora grazie!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_3.5/" rel="tag"&gt;ASP.NET 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Cache/" rel="tag"&gt;Cache&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Community_Days_2010/" rel="tag"&gt;Community Days 2010&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Databinding/" rel="tag"&gt;Databinding&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Dynamic_Data_Control/" rel="tag"&gt;Dynamic Data Control&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2671/CDays10-The-Day-After-Ringraziamenti-Precisazioni-.aspx"&gt;&lt;em&gt;CDays10, the day after: ringraziamenti, precisazioni, tricchettracc e bombamman&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework 4.0, ASP.NET 3.5, ASP.NET 4.0, Cache, Community Days 2010, Databinding, Dynamic Data Control</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2671/CDays10-The-Day-After-Ringraziamenti-Precisazioni-.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2671/CDays10-The-Day-After-Ringraziamenti-Precisazioni-.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2671.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2671</trackback:ping></item><item><title>ASP.NET Web Forms ai Community Days, nel 2010</title><link>http://blogs.aspitalia.com/cradle/post2668/ASP.NET-Web-Forms-Community-Days-2010.aspx</link><pubDate>Fri, 10 Dec 2010 10:25:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2668" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;A parte il riferimento temporale, un post con un simile titolo avrebbe potuto tranquillamente essere pubblicato 5 anni fa (se non fosse che allora i Community Days non erano stati ancora inventati :D ). Si sa, è usanza - ed entro certi limiti non c'è niente di male, beninteso - seguire le mode del momento, che vogliono ad esempio in ASP.NET MVC la piattaforma più gettonata di cui parlare quando si vuole affrontare l'argomento dello sviluppo per il Web.&lt;/p&gt;&lt;p&gt;E però esiste tanto ASP.NET Web Forms in giro, ad oggi la piattaforma più diffusa per realizzare Web App basate su .NET, e soprattutto, si tratta di una tecnologia &lt;strong&gt;estremamente moderna&lt;/strong&gt;: &lt;strong&gt;Routing&lt;/strong&gt;, &lt;strong&gt;Data Template&lt;/strong&gt;, &lt;strong&gt;Data Annotations&lt;/strong&gt;, &lt;strong&gt;controllo del markup&lt;/strong&gt;, sono concetti che spesso si associano alle View, ai Model e ai Controller, magari portandoci erroneamente a pensare che, se vogliamo avvalercene, ASP.NET MVC sia una scelta obbligata.&lt;/p&gt;&lt;p&gt;Ebbene, non è assolutamente vero, ed è la principale ragione per cui, secondo me, ha veramente tantissimo senso &lt;strong&gt;nel 2010&lt;/strong&gt; avere una sessione come &lt;strong&gt;WebForms.Reload()&lt;/strong&gt; nell'agenda dei &lt;strong&gt;Community Days&lt;/strong&gt; e, di riflesso, è per me un grandissimo piacere poterne parlare. Visto che poi non ci facciamo mancare niente, toccheremo anche l'argomento Performance, e in particolare quel gioiellino che è &lt;strong&gt;AppFabric&lt;/strong&gt;, su cui ad esempio è basata l'infrastruttura di cache dell'interno network &lt;strong&gt;ASPItalia&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Che dire, se ho stuzzicato la vostra curiosità, ci vediamo a Milano, giovedì e venerdì prossimi.&lt;/p&gt;&lt;p&gt;Ciauz!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_3.5/" rel="tag"&gt;ASP.NET 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Cache/" rel="tag"&gt;Cache&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Community_Days_2010/" rel="tag"&gt;Community Days 2010&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Databinding/" rel="tag"&gt;Databinding&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Dynamic_Data_Control/" rel="tag"&gt;Dynamic Data Control&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2668/ASP.NET-Web-Forms-Community-Days-2010.aspx"&gt;&lt;em&gt;ASP.NET Web Forms ai Community Days, nel 2010&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework, .NET Framework 4.0, ASP.NET 3.5, ASP.NET 4.0, Cache, Community Days 2010, Databinding, Dynamic Data Control</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2668/ASP.NET-Web-Forms-Community-Days-2010.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2668/ASP.NET-Web-Forms-Community-Days-2010.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2668.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2668</trackback:ping></item><item><title>ASPItalia ti premia con Visual Studio 2010 Ultimate + MSDN Subscription!</title><link>http://blogs.aspitalia.com/cradle/post2653/ASPItalia-Premia-Visual-Studio-2010-Ultimate-MSDN-Subscription.aspx</link><pubDate>Wed, 01 Sep 2010 09:52:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2653" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Eh sì, per alleviarvi il triste ritorno dalle vacanze, ci siamo inventati un'iniziativa niente male: se siete appassionati di tecnologia e di sviluppo software, se avete pensato qualche volta che potevate contribuire con le vostre conoscenze a migliorare la community di ASPItalia, se magari in passato avete trovato delle dritte interessanti sui nostri forum e vi va di passare dalla parte di chi i consigli e le soluzioni invece le elargisce... insomma, se un po' vi riconoscete in qualcuno di questi &amp;quot;se&amp;quot;, &lt;a href="http://g.aspitalia.com/landings/competitions/"&gt;ASPItalia Community Awards 2010&lt;/a&gt; è lì per voi!&lt;/p&gt;&lt;p&gt;In base ai vostri contributi, secondo le modalità descritte nella &lt;a href="http://g.aspitalia.com/landings/competitions/"&gt;pagina dell'evento&lt;/a&gt;, stileremo una classifica e coloro che a fine mese si troveranno nelle prime &lt;strong&gt;due posizioni&lt;/strong&gt; si porteranno a casa niente meno che una &lt;strong&gt;Visual Studio 2010 Ultimate con MSDN Subscription&lt;/strong&gt; a testa (quindi in totale, regaliamo ben QUATTRO MSDN a quattro di voi!).&lt;/p&gt;&lt;p&gt;Dai, cosa aspettate? ;-)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASPItalia.com/" rel="tag"&gt;ASPItalia.com&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2653/ASPItalia-Premia-Visual-Studio-2010-Ultimate-MSDN-Subscription.aspx"&gt;&lt;em&gt;ASPItalia ti premia con Visual Studio 2010 Ultimate + MSDN Subscription!&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Misc, .NET Framework, .NET Framework 4.0, ASP.NET, ASP.NET 4.0, ASPItalia.com, Silverlight, Visual Studio, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2653/ASPItalia-Premia-Visual-Studio-2010-Ultimate-MSDN-Subscription.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2653/ASPItalia-Premia-Visual-Studio-2010-Ultimate-MSDN-Subscription.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2653.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2653</trackback:ping></item><item><title>Inside ModelVirtualCasting #7: Come ti creo una form MVC in 20 secondi (a dire tanto...)</title><link>http://blogs.aspitalia.com/cradle/post2640/Inside-ModelVirtualCasting-Sharp7-Creo-Form-MVC-20-A-Dire.aspx</link><pubDate>Tue, 15 Jun 2010 05:50:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2640" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Settima puntata per questa serie su &lt;a href="http://modelvirtualcasting.aspitalia.com/"&gt;ModelVC&lt;/a&gt; che, se continua così, ci porteremo fin sotto all'ombrellone! Qualche link ai precedenti post prima di iniziare...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/cradle/post2627/Inside-ModelVirtualCasting-Sharp1-Introduzione-Repository.aspx"&gt;Introduzione ai repository&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/cradle/post2629/Inside-ModelVirtualCasting-Sharp2-Architettura-Interna-Repository.aspx"&gt;Architettura interna dei repository&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/daniele/post2630/Inside-ModelVirtualCasting-Sharp3-Cache.aspx"&gt;La cache&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/cradle/post2634/Inside-ModelVirtualCasting-Sharp4-Funziona-CacheThis.aspx"&gt;Come funziona CacheThis?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/ricciolo/post2636/Inside-ModelVirtualCasting-Sharp5-Servizi.aspx"&gt;I servizi&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/daniele/post2637/Inside-ModelVirtualCasting-Sharp6-SEO-ASP.NET-4.0.aspx"&gt;SEO con ASP.NET 4.0&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Stavolta ci tocca il compito di sfatare un mito, ossia il fatto che con &lt;strong&gt;ASP.NET MVC&lt;/strong&gt; il codice da scrivere è verboso, lungo e, in parole povere, molto meno &lt;a href="http://en.wikipedia.org/wiki/Rapid_application_development"&gt;RAD&lt;/a&gt; di Web Forms. Niente di più falso, grazie all'introduzione in MVC 2 degli &lt;strong&gt;editor e visualizer templates&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Immaginiamo un'ipotetica form di inserimento dati. Mentre in Web Forms il fulcro centrale dell'interfaccia è costituito dall'insieme dei controlli, in MVC invece&lt;strong&gt; il ruolo di protagonista è recitato dal model&lt;/strong&gt;, e dagli oggetti che lo compongono. Si tratta, quindi, di un concetto &lt;strong&gt;molto più di &amp;quot;business&amp;quot;&lt;/strong&gt; rispetto al passato, in cui possiamo specificare che un oggetto di tipo DateTime deve essere ovunque rappresentato in un certo modo e modificato in un altro.&lt;/p&gt;&lt;p align="baseline"&gt;Gli editor e visualizer templates non fanno altro che rendere possibile questo livello di astrazione: possiamo immaginarli come delle &lt;strong&gt;mini-partial view&lt;/strong&gt;, che vengono associate ad un particolare tipo di dato grazie al nome e automaticamente iniettate dal framework quando lo si voglia visualizzare o modificare. In ModelVC, ad esempio, ho voluto utilizzare il &lt;a href="http://jqueryui.com/demos/datepicker/"&gt;DatePicker&lt;/a&gt; di &lt;a href="http://jqueryui.com/"&gt;jQueryUI&lt;/a&gt; come editor per tutte le proprietà di tipo &lt;strong&gt;DateTime&lt;/strong&gt; di qualsiasi model delle mie pagine. Per farlo, ho creato un template di nome &lt;strong&gt;DateTime.ascx&lt;/strong&gt; (occhio che il nome è importante) che ho messo nella posizione che vedete in figura.&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.aspitalia.com/img/Cradle/insidemodelvirtualcasting7formin20secondi/folders.jpg" /&gt;&lt;/p&gt;&lt;p&gt;Ma cosa contiene DateTime.ascx?&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;code&gt;&amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewUserControl&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0;private string dateString&lt;br /&gt;&amp;#xa0;&amp;#xa0;{&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;get&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;{&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;if (this.Model == null)&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0;return null;&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;return ((DateTime)this.Model).ToShortDateString();&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;}&lt;br /&gt;&amp;#xa0;&amp;#xa0;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;%= Html.TextBox(&amp;quot;&amp;quot;, dateString, new { @class = &amp;quot;dateInput&amp;quot; })%&amp;gt;&lt;/code&gt;&lt;p&gt;Fondamentalmente niente di che, semplicemente una &lt;strong&gt;TextBox con una classe CSS&lt;/strong&gt; particolare (dateInput) che posso utilizzare nella master page per attivare il DatePicker su tutte quelle che ne fanno uso:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;code&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0;$(function () {&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;$.datepicker.setDefaults($.datepicker.regional['it']);&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;$('.dateInput').datepicker();&lt;br /&gt;&amp;#xa0;&amp;#xa0;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;p&gt;Il risultato dell'aver definito questo template è che basta a questo punto scrivere&lt;/p&gt;&lt;code&gt;&amp;lt;%= Html.EditorFor(m =&amp;gt; m.BirthDate) %&amp;gt;&lt;/code&gt;&lt;p&gt;perché il nostro bell'editor custom venga utilizzato in luogo del normale box di testo, semplicemente perché BirthDate è di tipo DateTime (in realtà è anche possibile specificare esplicitamente quale editor referenziare tramite le &lt;strong&gt;DataAnnotations&lt;/strong&gt;).&lt;/p&gt;&lt;p&gt;Non male, vero? Ma l'aspetto più interessante è che, dato che da che mondo è mondo, in .NET &lt;strong&gt;tutto eredita da Object&lt;/strong&gt;, e nulla mi vieta di realizzare un bel template Object.ascx, che magari &lt;strong&gt;cicli per tutte le proprietà di un oggetto&lt;/strong&gt; e per ognuna di esse renderizzi l'opportuno editor, magari di nuovo di tipo Object. Morale della favola: ho l'oggetto &lt;strong&gt;Candidate&lt;/strong&gt;, che referenzia alcune altre entity e diversi complex type e voglio realizzarne una form di edit; bene, non devo far altro che scrivere&lt;/p&gt;&lt;code&gt;&amp;lt;%= Html.EditorFor(m =&amp;gt; m) %&amp;gt;&lt;/code&gt;&lt;p&gt;o ancora meglio&lt;/p&gt;&lt;code&gt;&amp;lt;%= Html.EditorForModel() %&amp;gt;&lt;/code&gt;&lt;p&gt;Come ho fatto? Andate a vederlo sul &lt;a href="http://modelvirtualcasting.codeplex.com/releases/view/46151"&gt;codice sorgente di ModelVC&lt;/a&gt; e nel frattempo, provate anche a vedere se riuscite con Web Forms a realizzare una form altrettanto velocemente ;-)&lt;/p&gt;&lt;p&gt;Ciao!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_MVC/" rel="tag"&gt;ASP.NET MVC&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Custom_Control/" rel="tag"&gt;Custom Control&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/jQuery/" rel="tag"&gt;jQuery&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Model_Virtual_Casting/" rel="tag"&gt;Model Virtual Casting&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/User_Control/" rel="tag"&gt;User Control&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2640/Inside-ModelVirtualCasting-Sharp7-Creo-Form-MVC-20-A-Dire.aspx"&gt;&lt;em&gt;Inside ModelVirtualCasting #7: Come ti creo una form MVC in 20 secondi (a dire tanto...)&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework 4.0, ASP.NET 4.0, ASP.NET MVC, Custom Control, jQuery, Model Virtual Casting, User Control</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2640/Inside-ModelVirtualCasting-Sharp7-Creo-Form-MVC-20-A-Dire.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2640/Inside-ModelVirtualCasting-Sharp7-Creo-Form-MVC-20-A-Dire.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2640.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2640</trackback:ping></item><item><title>Inside ModelVirtualCasting #4: Come funziona CacheThis?</title><link>http://blogs.aspitalia.com/cradle/post2634/Inside-ModelVirtualCasting-Sharp4-Funziona-CacheThis.aspx</link><pubDate>Thu, 03 Jun 2010 05:30:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2634" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Quarto post della serie sugli internals dell'applicazione che abbiamo mostrato nel corso della Real Code Conference 4.0 lo scorso 25 Maggio 2010 i cui sorgenti sono disponibili &lt;a href="http://modelvirtualcasting.codeplex.com"&gt;su Codeplex&lt;/a&gt;:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;a href="http://blogs.aspitalia.com/cradle/post2627/Inside-ModelVirtualCasting-Sharp1-Introduzione-Repository.aspx"&gt;Introduzione ai repository&lt;/a&gt; &lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.aspitalia.com/cradle/post2629/Inside-ModelVirtualCasting-Sharp2-Architettura-Interna-Repository.aspx"&gt;Architettura interna dei repository&lt;/a&gt; &lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.aspitalia.com/daniele/post2630/Inside-ModelVirtualCasting-Sharp3-Cache.aspx"&gt;La cache&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Come funziona CacheThis &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Dell'attributo &lt;strong&gt;CacheThis&lt;/strong&gt; ha già parlato un pochino &lt;a href="http://blogs.aspitalia.com/daniele/"&gt;Daniele&lt;/a&gt; &lt;a href="http://blogs.aspitalia.com/daniele/post2630/Inside-ModelVirtualCasting-Sharp3-Cache.aspx"&gt;nello scorso post&lt;/a&gt;, qualche giorno prima di RCC mi ha proposto di realizzare questa cosa perché era una figheria simpatica da far vedere, e allora mi sono convinto e l'ho messa su! Si tratta di un sistema per effettuare caching dei risultati di un metodo in maniera trasparente. Infatti, in maniera dichiarativa, ci basta scrivere:&lt;/p&gt; &lt;code&gt;public interface INewsRepository : IRepository&amp;lt;INewsRepository, News&amp;gt; &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [CacheThis(&amp;quot;last-news&amp;quot;, 60)] &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;NewsDTO&amp;gt; GetLastNewsDTO(int number); &lt;br /&gt;}&lt;/code&gt; &lt;p&gt;ed ecco che, come per incanto, il risultato di GetLastNewsDTO &lt;strong&gt;viene prelevato dalla cache&lt;/strong&gt;, se presente, oppure recuperato tramite una query su DataBase. Ma come funziona tutto questo, visto che, l'implementazione di questo metodo &lt;strong&gt;non ha la minima cognizione&lt;/strong&gt; del concetto di Cache?&lt;/p&gt; &lt;code&gt;public List&amp;lt;NewsDTO&amp;gt; GetLastNewsDTO(int number) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return CurrentObjectSet.AsQueryable() &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .OrderByDescending(n =&amp;gt; n.PublicationDate) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Take(number) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .SelectDTO&amp;lt;News, NewsDTO&amp;gt;().ToList(); &lt;br /&gt;}&lt;/code&gt; &lt;p&gt;&lt;strong&gt;CacheThis &lt;/strong&gt;è un tipico esempio di &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;Aspect Oriented Programming&lt;/a&gt; sul quale potremmo scrivere qualche decina di post ma che, in parole povere, consente di &lt;strong&gt;iniettare logica in maniera modulare &lt;/strong&gt;nelle chiamate ai metodi di un oggetto, più o meno agendo in questo modo:&lt;/p&gt; &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.aspitalia.com/img/cradle/insidemodelvirtualcasting4comefunzionaca_14082/image_9b1db098-b899-48fe-9a9a-a1117dd9d6b8.png" width="549" height="278" /&gt; &lt;/p&gt; &lt;p&gt;In pratica, possiamo fare in modo che &lt;strong&gt;Unity&lt;/strong&gt;, quando chiediamo un'istanza di &lt;strong&gt;INewsRepository&lt;/strong&gt;, non restituisca direttamente NewsRepository, come ci aspetteremmo, bensì un &lt;strong&gt;proxy&lt;/strong&gt;, che implementa però la stessa interfaccia così che il nostro codice &lt;strong&gt;non si accorga minimamente&lt;/strong&gt; che qualcuno sta cambiando le carte in tavola.&lt;/p&gt; &lt;p&gt;Cosa fa questo proxy? Beh, normalmente niente, si limita a girare ogni chiamata a NewsRepository e a restituire il risultato prodotto, tranne quando il metodo invocato sia decorato dal famigerato attributo &lt;strong&gt;CacheThis&lt;/strong&gt;, nel qual caso viene eseguito il nostro bel &lt;strong&gt;CacheHandler&lt;/strong&gt; che, grossomodo, è fatto così (in pseudocodice):&lt;/p&gt; &lt;code&gt;public Result Invoke(...) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (Cache.Contains(key)) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Cache[key]; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; var result = invokeRealMethod(...);&lt;/p&gt; &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Cache.Add(key, result);&lt;/p&gt; &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; return result; &lt;br /&gt;}&lt;/p&gt; &lt;/code&gt; &lt;p&gt;In parole povere, &lt;strong&gt;CacheHandler&lt;/strong&gt; verifica se il risultato è già presente in cache, se viene trovato lo restituisce, altrimenti esegue il repository vero e proprio, mette in cache il risultato e lo ritorna.&lt;/p&gt; &lt;p&gt;Ora.. a dire il vero l'implementazione contenuta in ModelVC soffre di un paio di limitazioni, che sono nella lista della spesa delle feature da metter su per la prossima versione:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;supporta esclusivamente l'&lt;strong&gt;invalidazione via timeout&lt;/strong&gt;, mentre sarebbe bello se una Add/Modify/Delete di una news tramite repository invalidasse automaticamente la cache; &lt;/li&gt; &lt;li&gt;come sappiamo, quando realizziamo una query in LINQ to Entities, questa &lt;strong&gt;non viene eseguita finché non se ne esplori il risultato&lt;/strong&gt;; morale della favola.. dobbiamo forzarne l'esecuzione all'interno di NewsRepository (concreto), ad esempio con un ToList, altrimenti rischiamo di mettere in cache l'expression tree e non i risultati veri e propri. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;D'altro canto, però, CacheThis riesce a mantenere in Cache diversi risultati dello stesso metodo, &lt;strong&gt;creando chiavi on-the-fly a seconda dei parametri con cui è stato invocato&lt;/strong&gt; e, soprattutto, ci mostra come in maniera semplice possiamo sfruttare questa tecnica (che di per sé è invece parecchio avanzata) per &lt;strong&gt;iniettare funzionalità tramite Unity all'interno del nostro codice&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Che dire? Se volete saperne di più... i sorgenti di ModelVC &lt;a href="http://modelvirtualcasting.codeplex.com/releases/view/46151"&gt;non aspettano altro che essere scaricati&lt;/a&gt;, e continuate a seguire &lt;a href="http://modelvirtualcasting.codeplex.com/releases/view/46151"&gt;questa serie di post&lt;/a&gt; che io e gli altri ragazzi dello staff continueremo a pubblicare nei prossimi giorni.&lt;/p&gt; &lt;p&gt;Ciauz!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Architettura/" rel="tag"&gt;Architettura&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Cache/" rel="tag"&gt;Cache&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Model_Virtual_Casting/" rel="tag"&gt;Model Virtual Casting&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Object_Oriented_Programming/" rel="tag"&gt;Object Oriented Programming&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2634/Inside-ModelVirtualCasting-Sharp4-Funziona-CacheThis.aspx"&gt;&lt;em&gt;Inside ModelVirtualCasting #4: Come funziona CacheThis?&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Architettura, Cache, Entity Framework, Model Virtual Casting, Object Oriented Programming</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2634/Inside-ModelVirtualCasting-Sharp4-Funziona-CacheThis.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2634/Inside-ModelVirtualCasting-Sharp4-Funziona-CacheThis.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2634.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2634</trackback:ping></item><item><title>Inside ModelVirtualCasting #2: Architettura interna dei repository</title><link>http://blogs.aspitalia.com/cradle/post2629/Inside-ModelVirtualCasting-Sharp2-Architettura-Interna-Repository.aspx</link><pubDate>Mon, 31 May 2010 05:30:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2629" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Secondo post della serie sugli internals di ModelVC che abbiamo presentato a Real Code Day 4.0 prima e successivamente a Real Code Conference 4.0.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;a href="http://blogs.aspitalia.com/cradle/post2627/Inside-ModelVirtualCasting-Sharp1-Introduzione-Repository.aspx"&gt;Introduzione ai repository&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Architettura interna dei repository &lt;/li&gt; &lt;li&gt;more to come... &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;La volta scorsa abbiamo visto perché abbiamo scelto di utilizzare i repository all'interno di ModelVC e abbiamo dato una panoramica dell'architettura secondo cui funzionano, che essenzialmente li porta ad essere dei wrapper degli ObjectSet di ADO.NET Entity Framework con qualche funzionalità in più. Semplificando un po', allora, il codice di un repository può essere pensato simile al seguente:&lt;/p&gt; &lt;code&gt;public class Repository&amp;lt;T&amp;gt; where T : class &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private IObjectSet&amp;lt;T&amp;gt; objectSet; &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public Repository(ObjectContext context) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.objectSet = context.CreateObjectSet&amp;lt;T&amp;gt;(); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; internal Repository(IObjectSet&amp;lt;T&amp;gt; objectSet) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.objectSet = objectSet; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public void InsertOnSubmit(T entity) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.objectSet.AddObject(entity); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public void Update(T entity) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.objectSet.Attach(entity); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public IQueryable&amp;lt;T&amp;gt; Where(Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; predicate) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this.objectSet.Where(predicate); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt;}&lt;/code&gt; &lt;p&gt;Notiamo un paio di aspetti interessanti, che ci semplificano tanto la vita in fase di test:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Non manteniamo &lt;strong&gt;alcun riferimento&lt;/strong&gt; a tipi concreti di ADO.NET Entity Framework, che è presente solo con l'interfaccia &lt;strong&gt;IObjectSet&amp;lt;T&amp;gt;&lt;/strong&gt;; &lt;/li&gt; &lt;li&gt;E' presente un costruttore internal tramite cui fornire direttamente un IObjectSet, che può essere utilizzato &lt;strong&gt;per iniettare un mock o un fake&lt;/strong&gt;. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Ottimo, sarebbe tutto bellissimo se non fosse che purtroppo per le funzionalità che vogliamo esporre, la sola IObjectSet&amp;lt;T&amp;gt; non basta: esempio? il metodo &lt;strong&gt;Include&lt;/strong&gt;, che vogliamo utilizzare per indicare ad EF quali entity collegate deve caricare, è esposto da &lt;strong&gt;ObjectSet&amp;lt;T&amp;gt; &lt;/strong&gt;(e anche da ObjectQuery, sua classe base) ma non dall'interfaccia. Come fare allora? Io e &lt;a href="http://blogs.aspitalia.com/sm15455/"&gt;Stefano&lt;/a&gt; ci abbiamo riflettuto un po' e alla fine ne siamo venuti a capo in questo modo:&lt;/p&gt; &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.aspitalia.com/img/cradle/insidemodelvirtualcasting2architetturain_10253/image_2b318124-f37d-469c-9f17-9132d8994a13.png" width="475" height="293" /&gt; &lt;/p&gt; &lt;p&gt;In pratica abbiamo introdotto le nuove interfacce &lt;strong&gt;IObjectQuery&amp;lt;T&amp;gt;&lt;/strong&gt; e &lt;strong&gt;IIncludeObjectSet&amp;lt;T&amp;gt;&lt;/strong&gt;, che espongono il metodo Include come desiderato; in particolare quest'ultima è referenziata all'interno di Repository&amp;lt;T&amp;gt; &lt;strong&gt;al posto di IObjectSet&amp;lt;T&amp;gt;&lt;/strong&gt;, così che finalmente abbiamo a disposizione la funzionalità richiesta.&lt;/p&gt; &lt;p&gt;In Entity Framework, però, ObjectSet&amp;lt;T&amp;gt; ovviamente non implementa IIncludeObjectSet&amp;lt;T&amp;gt;, e pertanto siamo stati costretti a realizzarne &lt;strong&gt;un wrapper&lt;/strong&gt;. Si tratta di un giro un po' complicato se vogliamo (tra l'altro la versione che trovate su ModelVC è leggermente più complessa) ma che fondamentalmente ci consente di costruire repository senza avere riferimenti a tipi concreti di Entity Framework. A cosa serve? a darci la possibilità di realizzare un &lt;strong&gt;FakeObjectSet&lt;/strong&gt;, che trovate in &lt;strong&gt;ASPItalia.ModelVirtualCasting.MVC.Tests&lt;/strong&gt; nella cartella Utils, che possiamo utilizzare per verificare che il nostro repository funzioni senza scomodare SQL Server:&lt;/p&gt; &lt;code&gt;var list = new List&amp;lt;User&amp;gt;(); &lt;br /&gt;list.Add(new User() { Nick = &amp;quot;Cradle&amp;quot;}); &lt;br /&gt; &lt;br /&gt;var rep = new UserRepository(new FakeObjectSet&amp;lt;User&amp;gt;(list)); &lt;br /&gt;Assert.AreEqual(list[0], repo.GetByNickname("Cradle"));&lt;/code&gt; &lt;p&gt;Cool, isn't it? Alla prossima!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Architettura/" rel="tag"&gt;Architettura&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASPItalia.com/" rel="tag"&gt;ASPItalia.com&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Model_Virtual_Casting/" rel="tag"&gt;Model Virtual Casting&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Pattern/" rel="tag"&gt;Pattern&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2629/Inside-ModelVirtualCasting-Sharp2-Architettura-Interna-Repository.aspx"&gt;&lt;em&gt;Inside ModelVirtualCasting #2: Architettura interna dei repository&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Architettura, ASPItalia.com, Model Virtual Casting, Pattern</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2629/Inside-ModelVirtualCasting-Sharp2-Architettura-Interna-Repository.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2629/Inside-ModelVirtualCasting-Sharp2-Architettura-Interna-Repository.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2629.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2629</trackback:ping></item><item><title>Inside ModelVirtualCasting #1: Introduzione ai repository</title><link>http://blogs.aspitalia.com/cradle/post2627/Inside-ModelVirtualCasting-Sharp1-Introduzione-Repository.aspx</link><pubDate>Thu, 27 May 2010 06:00:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2627" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Allora, l'avevo promesso, vediamo quanto riesco a mantenere l'impegno preso nel scrivere una serie di post su alcuni aspetti, soprattutto architetturali, che abbiamo scelto di utilizzare in &lt;a href="http://modelvirtualcasting.codeplex.com/"&gt;ModelVirtualCasting&lt;/a&gt; (ModelVC per gli amici).&lt;/p&gt;

&lt;p&gt;L'argomento di cui vorrei parlarvi stasera è &lt;strong&gt;il modello di accesso ai dati&lt;/strong&gt; che abbiamo scelto di utilizzare. Immagino che abbiate capito che ModelVC usi internamente &lt;strong&gt;ADO.NET Entity Framework&lt;/strong&gt;, sebbene questo non sia esposto direttamente agli strati sovrastanti, che invece hanno la possibilità di accedere alla base dati tramite degli oggetti chiamati &lt;strong&gt;Repository&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cos'è un repository e soprattutto, perché questa scelta? In due parole, un repository è un oggetto che si frappone tra noi e lo strato di accesso ai dati, comportandosi come se fosse &lt;strong&gt;una normale collection .NET&lt;/strong&gt;, supportando quindi aggiunte e rimozioni di oggetti, e sul quale possiamo eseguire query (ad esempio tramite &lt;strong&gt;LINQ&lt;/strong&gt;) come se i dati si trovassero già tutti in memoria. Ottimo, ma allora sono simili agli &lt;a href="http://msdn.microsoft.com/en-us/library/dd412719.aspx"&gt;ObjectSet&lt;/a&gt; di Entity Framework, che bisogno abbiamo di scrivere questo codice in più? Vediamo un attimo la struttura delle interfacce:&lt;/p&gt;

&lt;p&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://blogs.aspitalia.com/img/Cradle/insidemodelvirtualcasting1introduzioneai_556/image_7f9147cb-7cf3-484d-bd84-63f469d1f5ca.png" width="568" height="311" /&gt; &lt;/p&gt;

&lt;p&gt;Come vedete, questa architettura mi consente un livello di personalizzazione che con gli ObjectSet non ho, ossia:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Avere a disposizione due interfacce base, &lt;strong&gt;IReadOnlyRepository&lt;/strong&gt; e &lt;strong&gt;IRepository&lt;/strong&gt;, ci consente di &lt;strong&gt;forzare in sola lettura&lt;/strong&gt; alcune entità, che by design immaginiamo non dovranno mai essere inserite o eliminate; &lt;/li&gt;

  &lt;li&gt;Possiamo esporre &lt;strong&gt;metodi personalizzati&lt;/strong&gt; per un repository specifico, quando questo può risultare comodo, come nel caso di &lt;strong&gt;GetByUsername &lt;/strong&gt;su IUserRepository &lt;/li&gt;

  &lt;li&gt;Possiamo &lt;strong&gt;personalizzare il comportamento &lt;/strong&gt;in fase di Add, ad esempio effettuando su UserRepository un override del metodo InsertOnSubmit e verificare al suo interno che l'email dell'utente che stiamo inserendo non sia già presente nel database. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il tutto senza rinunciare alle potenzialità di &lt;strong&gt;Linq To Entities&lt;/strong&gt;, visto che i nostri Repository agiscono come wrapper proprio di ObjectSet e che metodi come Where e GetAll restituiscono una IQueryable&amp;lt;T&amp;gt;, così che possiamo tranquillamente scrivere qualcosa tipo&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var query = myUserRepository&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;.Where(u =&amp;gt; u.Username == u.Password)&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;.Select(u =&amp;gt; new { Nick = u.Username, Email = u.Email } );&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;e star sicuri che l'expression tree generato verrà dato in pasto all'engine di EF e &lt;strong&gt;tradotto in una query SQL&lt;/strong&gt; verso il database.&lt;/p&gt;

&lt;p&gt;Ultimo e fondamentale vantaggio, avere questa struttura basata su interfacce ci consente di &lt;strong&gt;disaccoppiare gli strati superiori &lt;/strong&gt;(servizi o UI) da una particolare implementazione, che può essere invece scelta a runtime, così che l'indomani possiamo realizzare un set di repository basati su una tecnologia completamente diversa (mah.. questa affermazione mi è sempre sembrata un po' fuffosa, sarò sincero con voi :D) o soprattutto:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Semplificarci la vita in fase di test&lt;/strong&gt;, visto che un IUserRepository è infinitamente più facile da mockare rispetto a EntityFrameworkContext.Users (brrr...); questo è un punto a favore &lt;strong&gt;importantissimo&lt;/strong&gt;, dato che IObjectSet&amp;lt;T&amp;gt; già esposta da EntityFramework in realtà non espone tutte le logiche necessarie a gestire con efficacia un ObjectSet perché mancano parecchie robe fondamentali; &lt;/li&gt;

  &lt;li&gt;Possiamo realizzare dei &lt;strong&gt;FakeRepository &lt;/strong&gt;(li trovate in ASPItalia.ModelVirtualCasting.Fake) per testare la nostra applicazione su dati cablati nel codice, senza scomodare il database, consentendoci quindi a tutti gli effetti di &lt;strong&gt;parallelizzare alla grande il lavoro&lt;/strong&gt;; per esempio, io sono riuscito a sviluppare parte dell'interfaccia utente quando &lt;a href="http://blogs.aspitalia.com/SM15455/"&gt;Stefano&lt;/a&gt; ancora non aveva sviluppato nessun repository concreto, quindi &lt;strong&gt;con lo strato dati praticamante inesistente&lt;/strong&gt;! E vi assicuro che, quando Stefano ha completato il suo lavoro, non ho dovuto cambiare nulla della UI per adeguarmi, solo una serie di impostazioni sul web.config. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bene, con questa vi saluto e, sperando che vi interessi, vi do appuntamento ai prossimi post, nei quali ci addentreremo un po' nei meandri di questi oggetti per scoprire più nel dettaglio come sono fatti e come riusciamo ad istanziarli!&lt;/p&gt;

&lt;p&gt;Ciao!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Architettura/" rel="tag"&gt;Architettura&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASPItalia.com/" rel="tag"&gt;ASPItalia.com&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Model_Virtual_Casting/" rel="tag"&gt;Model Virtual Casting&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Pattern/" rel="tag"&gt;Pattern&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2627/Inside-ModelVirtualCasting-Sharp1-Introduzione-Repository.aspx"&gt;&lt;em&gt;Inside ModelVirtualCasting #1: Introduzione ai repository&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ORM, Architettura, ASPItalia.com, Entity Framework, Model Virtual Casting, Pattern</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2627/Inside-ModelVirtualCasting-Sharp1-Introduzione-Repository.aspx</guid><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2627/Inside-ModelVirtualCasting-Sharp1-Introduzione-Repository.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2627.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2627</trackback:ping></item></channel></rss>