<?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-2012 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Cortana' 2012.1.31</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Thu, 12 Jan 2012 08:30:00 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>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;/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) 2012 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</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) 2012 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) 2012 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) 2012 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) 2012 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) 2012 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) 2012 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) 2012 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) 2012 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><item><title>Real Code Conference 4.0: Debriefing...</title><link>http://blogs.aspitalia.com/cradle/post2626/Real-Code-Conference-4.0-Debriefing.aspx</link><pubDate>Wed, 26 May 2010 14:11:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2626" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;p&gt;Siete stati tantissimi e vorrei ringraziarvi ad uno ad uno per essere stati con noi, per averci fatto domande e per esservi mostrati così interessati a quanto avevamo da dirvi. Mi scuso per le persone che sono state costrette a vedere parte della conference nell'altra sala, ma il numero ha superato le nostre più rosee aspettative e ci siamo dovuti adattare un po' tutti.&lt;/p&gt;&lt;p&gt;Per quanto riguarda la mia sessione, devo dire che ho visto diversi volti interessati mentre parlavo; purtroppo in eventi di questo tipo non è possibile approfondire più di tanto gli argomenti, la fretta la fa sempre da padrona, ma spero di esser riuscito a fornirvi quantomeno l'idea degli effetti benefici che i test automatici possono portare alle nostre applicazioni e come si può approcciare il problema.&lt;/p&gt;&lt;p&gt;Per i dettagli, a breve troverete online la nostra applicazione nella versione che abbiamo mostrato (purtroppo a meno che non vogliate scaricare la trunk, quella attualmente in rilascio su codeplex è ancora relativa al passato RCD 4 dello scorso dicembre). Poi spero di trovare il tempo per scrivere nei prossimi giorni qualche post sul blog che vada un po' più a fondo sul tema del testing, non solo in ottica ASP.NET MVC, e magari realizzare qualche piccolo screencast. Non vi prometto nulla, ma ce la metterò tutta.&lt;/p&gt;&lt;p&gt;Ciao!&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/" 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_MVC/" rel="tag"&gt;ASP.NET MVC&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2626/Real-Code-Conference-4.0-Debriefing.aspx"&gt;&lt;em&gt;Real Code Conference 4.0: Debriefing...&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Architettura, .NET Framework, .NET Framework 4.0, ASP.NET MVC</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2626/Real-Code-Conference-4.0-Debriefing.aspx</guid><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2626/Real-Code-Conference-4.0-Debriefing.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2626.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2626</trackback:ping></item><item><title>Creare un filtro custom per QueryExtender</title><link>http://blogs.aspitalia.com/cradle/post2618/Creare-Filtro-Custom-QueryExtender.aspx</link><pubDate>Mon, 03 May 2010 13:40:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2618" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;QueryExtender &lt;/strong&gt;è uno strumento molto comodo per modificare le query generate da una &lt;strong&gt;EntityDataSource &lt;/strong&gt;e ciò che lo rende secondo me parecchio potente è la sua espandibilità.&lt;/p&gt;&lt;p&gt;Creare filtri personalizzati è infatti parecchio semplice se si ha un po' di dimistichezza con le lambda expression, visto che, in fin dei conti, non dobbiamo far altro che generare l'espressione desiderata e applicarla alla sorgente. Vediamo un po' nel dettaglio come fare, ad esempio, a realizzare un filtro in cui possiamo specificare il tipo di relazione (&amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;gt;=&amp;quot;, &amp;quot;&amp;lt;&amp;quot;, ecc.) e il termine di comparazione.&lt;/p&gt;&lt;p&gt;Il primo passo è quello di realizzare una classe che erediti da &lt;strong&gt;DataSourceExpression &lt;/strong&gt;o meglio, dato che il nostro filtro dovrà essere parametrico, da &lt;strong&gt;ParameterDataSourceExpression&lt;/strong&gt;, che implementa già tutta la logica necessaria a recuperare i valori dei parametri.&lt;/p&gt;&lt;p&gt;L'unico metodo da realizzare è &lt;strong&gt;GetQueryable&lt;/strong&gt;, che riceve in ingresso un oggetto &lt;strong&gt;IQueryable &lt;/strong&gt;e lo restituisce dopo averne eventualmente modificato l'espressione:&lt;/p&gt;&lt;code&gt;public override IQueryable GetQueryable(IQueryable source)&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0;// recupero i parametri grazie alla logica della classe base&lt;br /&gt;&amp;#xa0;&amp;#xa0;var values = this.Parameters.GetValues(this.Context, this.Owner);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0;// se non tutti i parametri sono specificati, non faccio nulla&lt;br /&gt;&amp;#xa0;&amp;#xa0;if (values.Count != 2 || values[0] == null || values[1] == null)&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;return null;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0;// .. qui logica per calcolare il filtro ..&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;L'aspetto, se vogliamo, leggermente complesso, è costruire la &lt;strong&gt;LambdaExpression&lt;/strong&gt;, dato che richiede un po' di conoscenza dell'anatomia di questo tipo di oggetti. Immaginiamo di voler scrivere questo tipo di espressione sull'oggetto &lt;strong&gt;Product &lt;/strong&gt;e cerchiamo di capire come scomporla:&lt;/p&gt;&lt;code&gt;p =&amp;gt; p.Amount &amp;lt; 25&lt;/code&gt;&lt;p&gt;Essa contiene:&lt;/p&gt;&lt;p&gt;1) Una &lt;strong&gt;costante &lt;/strong&gt;&amp;quot;25&amp;quot;&lt;/p&gt;&lt;code&gt;var constant = Expression.Constant(25, typeof(int));&lt;/code&gt;&lt;p&gt;2) Un &lt;strong&gt;parametro &lt;/strong&gt;&amp;quot;p&amp;quot; di tipo Product&lt;/p&gt;&lt;code&gt;var parameterExpression = Expression.Parameter(typeof(Product));&lt;/code&gt;&lt;p&gt;3) L'&lt;strong&gt;accesso alla proprietà&lt;/strong&gt; &amp;quot;Amount&amp;quot; di Product&lt;/p&gt;&lt;code&gt;var propertyExpression = Expression.PropertyOrField(parameterExpression, &amp;quot;Amount&amp;quot;);&lt;/code&gt;&lt;p&gt;4) Il &lt;strong&gt;confronto &lt;/strong&gt;&amp;quot;&amp;lt;&amp;quot; tra il risultato del punto (3) e quello del punto (1)&lt;/p&gt;&lt;code&gt;var compare = Expression.LessThan(propertyExpression, constant);&lt;/code&gt;&lt;p&gt;Questo oggetto è il &lt;strong&gt;body &lt;/strong&gt;della nostra lambda expression, ossia tutto ciò che è &lt;strong&gt;a destra&lt;/strong&gt; del simbolo &amp;quot;=&amp;gt;&amp;quot;. Per ottenere l'espressione completa è sufficiente specificare quali sono i &lt;strong&gt;parametri &lt;/strong&gt;che essa dovrà gestire, ossia i membri &lt;strong&gt;a sinistra&lt;/strong&gt; del simbolo &amp;quot;=&amp;gt;&amp;quot; (nel nostro caso Product, e quindi la stessa parameterExpression del punto 2):&lt;/p&gt;&lt;code&gt;var lambda = Expression.Lambda(compare, new ParameterExpression[] { parameterExpression });&lt;/code&gt;&lt;p&gt;Mettendo tutto insieme, il metodo GetQueryable diviene:&lt;/p&gt;&lt;code&gt;public override IQueryable GetQueryable(IQueryable source)&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var values = this.Parameters.GetValues(this.Context, this.Owner);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;if (values.Count != 2 || values[0] == null || values[1] == 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;// recupero la property su cui effettuare il filtro&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var parameterExpression =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;Expression.Parameter(source.ElementType);&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var propertyExpression =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;Expression.PropertyOrField(parameterExpression, this.DataField);&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;// creo il secondo membro dell'expression in base al valore recuperato&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;TypeConverter converter =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;TypeDescriptor.GetConverter(propertyExpression.Type);&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var constant =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;Expression.Constant(converter.ConvertFrom(values[1]), propertyExpression.Type);&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;// creo l'espressione di confronto&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var comparisonType = getComparisonType((string)values[0]);&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var compare =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;buildCompareExpression(propertyExpression, comparisonType, constant);&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;// genero la lambdaexpression&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var lambda =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;Expression.Lambda(compare, new ParameterExpression[] { parameterExpression });&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;return source.Provider.CreateQuery(&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;Expression.Call(&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0;typeof(Queryable), &amp;quot;Where&amp;quot;,&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; new Type[] { source.ElementType },&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; new Expression[] { source.Expression, Expression.Quote(lambda) }));&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Alcune cose da notare:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;L'uso di un &lt;strong&gt;TypeConverter &lt;/strong&gt;per convertire il parametro nel tipo desiderato da Expression.Constant;&lt;/li&gt;&lt;li&gt;Il metodo buildCompareExpression non fa altro che valutare l'operatore selezionato dall'utente (&amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;, ecc.) e costruire l'espressione corrispondente (&amp;quot;Expression.LessThan&amp;quot;, &amp;quot;Expression.GreaterThan&amp;quot;)&lt;/li&gt;&lt;li&gt;L'uso di &lt;strong&gt;Expression.Call&lt;/strong&gt; e di &lt;strong&gt;IQueryProvider.CreateQuery&lt;/strong&gt; per aggiungere una condizione di Where alla IQueryable originale. Questo è necessario perché l'extension method Where è generico e quindi richiede di specificare il tipo, che però nel nostro caso non è noto a priori.&lt;/li&gt;&lt;li&gt;Il fatto che abbiamo realizzato un filtro Where è un qualcosa di strettamente correlato alla nostra particolare implementazione, visto che &lt;strong&gt;non esistono vincoli infrastrutturali&lt;/strong&gt; in tal senso. Morale della favola: nulla ci vieta di implementare una DataSourceExpression per realizzare una Group By.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Il codice dell'esempio è scaricabile &lt;a href="http://blogs.aspitalia.com/img/Cradle/demo_queryextender_filtro_personalizzato/WebApplication3.zip"&gt;qui&lt;/a&gt;, per farlo funzionare vi basta sostituire la connection string con una che punti al database Northwind.&lt;/p&gt;&lt;p&gt;Ciao!&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/Databinding/" rel="tag"&gt;Databinding&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2618/Creare-Filtro-Custom-QueryExtender.aspx"&gt;&lt;em&gt;Creare un filtro custom per QueryExtender&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 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, Databinding, Entity Framework</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2618/Creare-Filtro-Custom-QueryExtender.aspx</guid><slash:comments>8</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2618/Creare-Filtro-Custom-QueryExtender.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2618.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2618</trackback:ping></item><item><title>ASP.NET MVC 2, ne vale la pena? Secondo me s&amp;#236;!</title><link>http://blogs.aspitalia.com/cradle/post2614/ASP.NET-MVC-Vale-Pena-SI.aspx</link><pubDate>Wed, 28 Apr 2010 05:53:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2614" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;Diciamolo chiaramente: per chi oramai sono anni che lavora con WebForms, passare ad ASP.NET MVC sulle prime può sembrare un ritorno alle origini (se va bene) o un great pain in the ass (se ci siamo svegliati con la luna storta).&lt;/p&gt; &lt;p&gt;Eppure la versione 2, che è disponibile - vale la pena ricordarlo - sia per &lt;strong&gt;Visual Studio 2010&lt;/strong&gt; che per &lt;strong&gt;Visual Studio 2008&lt;/strong&gt;, di novità ne ha portate parecchie, soprattutto dal punto di vista della &lt;strong&gt;produttività&lt;/strong&gt;: strano a dirsi, eh? e invece no! ASP.NET MVC 2 adotta un sistema di templating e di validazione mutuato - udite udite - da ASP.NET Dynamic Data Controls, grazie al quale possiamo &lt;strong&gt;realizzare interfacce complete e complesse veramente nel giro di pochissimo tempo&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Non ci credete? Beh, è una prima ragione per &lt;a href="http://www.aspitalia.com/eventi/27/Real-Code-Conference-4.0-Firenze.aspx"&gt;vederci a Firenze il 25 maggio&lt;/a&gt;, non trovate?&lt;/p&gt; &lt;p&gt;&amp;quot;Sì&amp;quot;, direte voi, &amp;quot;ottimo. Ma *perché* ASP.NET MVC? Chi me lo fa fare?&amp;quot;&lt;/p&gt; &lt;p&gt;La risposta è, ironia su ironia, un'altra domanda: &amp;quot;Scrivete &lt;strong&gt;test automatici&lt;/strong&gt; per il vostro codice?&amp;quot; &lt;/p&gt; &lt;p&gt;Se sì, magari parliamo di come testate le vostre pagine WebForms, giuro che mi interessa! E comunque valutate ASP.NET MVC, può veramente semplificare il vostro lavoro!&lt;/p&gt; &lt;p&gt;Se no, prendete in *seria* considerazione l'idea di iniziare! Magari proprio con ASP.NET MVC 2!&lt;/p&gt; &lt;p&gt;In entrambi i casi, proprio il testing è la seconda ragione per &lt;a href="http://www.aspitalia.com/eventi/27/Real-Code-Conference-4.0-Firenze.aspx"&gt;vederci a Firenze il 25 maggio&lt;/a&gt;. Perché secondo me parlare di MVC senza far vedere il testing è come andare a cena al ristorante e pagare il conto senza mangiare.&lt;/p&gt; &lt;p&gt;Morale della favola: ho pensato che alla &lt;a href="http://www.aspitalia.com/eventi/27/Real-Code-Conference-4.0-Firenze.aspx"&gt;Real Code Conference 4.0&lt;/a&gt; sarebbe stato interessante far vedere come scrivere un'applicazione real world con ASP.NET MVC 2 e decorarla con una bella suite di test automatici per ognuno dei suoi layer. D'altronde siamo nel 2010 no?&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/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_MVC/" rel="tag"&gt;ASP.NET MVC&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2614/ASP.NET-MVC-Vale-Pena-SI.aspx"&gt;&lt;em&gt;ASP.NET MVC 2, ne vale la pena? Secondo me s&amp;#236;!&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, ASP.NET MVC</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2614/ASP.NET-MVC-Vale-Pena-SI.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2614/ASP.NET-MVC-Vale-Pena-SI.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2614.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2614</trackback:ping></item><item><title>Ma che figo Reflector Pro di Red Gate</title><link>http://blogs.aspitalia.com/cradle/post2608/Figo-Reflector-Red-Gate.aspx</link><pubDate>Thu, 08 Apr 2010 22:47:25 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2608" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Come molti di voi sapranno, qualche mese fa &lt;a href="http://www.red-gate.com/"&gt;Red Gate&lt;/a&gt; ha acquistato &lt;a href="http://www.red-gate.com/products/reflector/index.htm"&gt;Reflector&lt;/a&gt;, il tool che, dopo Visual Studio, ogni sviluppatore .NET dovrebbe avviare quando si siede davanti al PC.&lt;/p&gt; &lt;p&gt;Da allora, alla versione tradizionale che è rimasta gratuita, si è aggiunto anche Reflector Pro, un'edizione a pagamento che promette cose mirabolanti. Volete un esempio? Sentite un po'.&lt;/p&gt; &lt;p&gt;Ho creato una semplice ConsoleApplication in C#, in cui ho messo questo codice:&lt;/p&gt; &lt;code&gt;List&amp;lt;string&amp;gt; someList = new List&amp;lt;string&amp;gt;(); &lt;br /&gt;someList.Add(&amp;quot;Ciao&amp;quot;);&lt;/code&gt; &lt;p&gt;Dopo aver installato Reflector Pro, in Visual Studio appare un nuovo menu, dal quale possiamo selezionare la voce &lt;strong&gt;Chose Assemblies to Debug&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.aspitalia.com/img/cradle/machefigoreflectorprodiredgate_b43/image_3.png" width="369" height="154" /&gt; &lt;/p&gt; &lt;p&gt;A questo punto, dalla finestra di Reflector, selezioniamo di voler debuggare &lt;strong&gt;mscorlib&lt;/strong&gt;, ossia l'assembly che contiene la definizione della classe &lt;strong&gt;List&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.aspitalia.com/img/cradle/machefigoreflectorprodiredgate_b43/image_5a845fd0-0f55-4616-9886-5c8139085fe0.png" width="442" height="322" /&gt; &lt;/p&gt; &lt;p&gt;Ciò che accade, è che Reflector inizia la decompilazione dell'assembly; nel nostro caso impiega qualche minuto, visto che si tratta di parecchio codice, ma esiste uno storage interno che funge da cache per queste definizioni, così che non sia necessario ripetere l'operazione. Al termine di tutto, mettiamo un breakpoint sulla seconda riga del nostro codice ed avviamo l'applicazione in debug:&lt;/p&gt; &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.aspitalia.com/img/cradle/machefigoreflectorprodiredgate_b43/image_502e8894-0dbe-435b-8533-a58c12c6deca.png" width="493" height="57" /&gt;&amp;#160; &lt;/p&gt; &lt;p&gt;Quando l'esecuzione si ferma sulla riga evidenziata, premiamo F11 e...&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;img title="image" border="0" alt="image" src="http://blogs.aspitalia.com/img/cradle/machefigoreflectorprodiredgate_b43/image_e14d8159-c258-49d6-9820-41bd84d4c85c.png" width="400" height="236" /&gt; &lt;/p&gt; &lt;p&gt;Notate il nome della classe in alto :-) Siamo andati in Step In dentro al codice del metodo &lt;strong&gt;Add&lt;/strong&gt; di &lt;strong&gt;List&amp;lt;T&amp;gt;&lt;/strong&gt; e possiamo avvalerci di tutte le funzionalità del debug di Visual Studio, dai watch (come si vede in figura) a che so... il debug multithreading di cui ho parlato ieri, mentre procediamo in step by step all'interno di mscorlib.dll.&lt;/p&gt; &lt;p&gt;Mica male!!&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/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2608/Figo-Reflector-Red-Gate.aspx"&gt;&lt;em&gt;Ma che figo Reflector Pro di Red Gate&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>Misc, .NET Framework, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2608/Figo-Reflector-Red-Gate.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2608/Figo-Reflector-Red-Gate.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2608.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2608</trackback:ping></item><item><title>Multithreading e parallel computing nel .NET Framework 4.0</title><link>http://blogs.aspitalia.com/cradle/post2607/Multithreading-Parallel-Computing-.NET-Framework-4.0.aspx</link><pubDate>Wed, 07 Apr 2010 23:40:41 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2607" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Una delle novità dell'imminente nuova versione del .NET Framework a cui personalmente ho dato parecchia importanza è il notevole supporto per &lt;strong&gt;multithreading&lt;/strong&gt; e &lt;strong&gt;parallel computing&lt;/strong&gt;. Spesso siamo abituati a confondere questi due termini e a usarli quasi come sinonimi, anche se sinonimi veri e propri non sono. Il multithreading è un qualcosa che è sui nostri desktop già da diversi anni, supportato dal Framework sin dalle sue prime incarnazioni. Il calcolo parallelo è invece qualcosa di più, che sfrutta il multithreading per massimizzare l'uso dei core messi a disposizione dall'hardware, un aspetto fondamentale nel momento in cui anche sui laptop non è raro imbattersi in 4, 6 o 8 core.&lt;/p&gt; &lt;p&gt;Ho avuto modo di occuparmi di questi aspetti durante la stesura di uno dei capitoli dei &lt;a href="http://g.aspitalia.com/landings/hoepli.aspx"&gt;nostri libri di prossima uscita&lt;/a&gt; interamente dedicato alle tematiche di multithreading e parallel computer, e penso francamente che il .NET Framework 4.0, il nuovo CLR e Visual Studio 2010 portino l'esperienza di sviluppo di applicazioni parallele a livelli assolutamente ineguagliati al giorno d'oggi.&lt;/p&gt; &lt;p&gt;Ma quali sono sostanzialmente queste novità? Beh. innanzitutto direi la presenza di &lt;a href="http://msdn.microsoft.com/en-us/library/dd460688%28VS.100%29.aspx"&gt;PLINQ&lt;/a&gt; e della classe &lt;a href="http://msdn.microsoft.com/en-us/library/dd383736%28VS.100%29.aspx"&gt;ParallelQuery&lt;/a&gt;, grazie alla quale è possibile integrare con grandissima facilità il calcolo parallelo all'interno delle nostre query LINQ; basta usare infatti l'extension method &lt;a href="http://msdn.microsoft.com/en-us/library/dd413602%28VS.100%29.aspx"&gt;AsParallel()&lt;/a&gt; per far sì che una query del tipo&lt;/p&gt; &lt;code&gt;var query = from i in list.AsParallel() &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where someCondition(i) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select someResult(i)&lt;/code&gt; &lt;p&gt;venga eseguita sfruttando al massimo i core presenti nel sistema.&lt;/p&gt; &lt;p&gt;Per il codice "di tutti i giorni", invece, sono state introdotte le classi &lt;a href="http://msdn.microsoft.com/en-us/library/dd321424%28VS.100%29.aspx"&gt;Task&lt;/a&gt; e &lt;a href="http://msdn.microsoft.com/en-us/library/dd321260%28VS.100%29.aspx"&gt;TaskFactory&lt;/a&gt;, che rendono possibile creare task asincroni, gestirne le notifiche, accodarne di altri, ecc.. in una sintassi estremamente concisa e intuitiva, che ci risparmia un bel po' di lavoro manuale che eravamo costretti a svolgere usando il &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx"&gt;ThreadPool&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ma più thread contemporaneamente in esecuzione vuol dire anche gestire problematiche di concorrenza e di thread safety. Chi ha lavorato in quest'ambito in passato, sa che ad esempio avere a che fare con collection condivise tra più thread non era assolutamente banale. Il .NET Framework 4.0 espone un nuovo namespace, dal nome fin troppo indicativo: &lt;a href="http://msdn.microsoft.com/en-us/library/system.collections.concurrent%28VS.100%29.aspx"&gt;System.Collections.Concurrent&lt;/a&gt;. Esso contiene un gran numero di collection, tutte rigorosamente thread safe, che risparmiano parecchie grane quando utilizzate in scenari paralleli e i cui internals (basta dare un'occhiata con Reflector) sono tutt'altro che banali e scontati, con lo scopo di minimizzare i lock, che notoriamente vanno a braccetto con decadimenti prestazionali.&lt;/p&gt; &lt;p&gt;E la ciliegina su questa torta non poteva che essere lui, Visual Studio 2010, e il suo supporto al debug di applicazioni multithreaded. Provate a dare un'occhiata a queste due immagini in basso per capire di cosa sto parlando, valgono più di mille parole:&lt;/p&gt; &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.aspitalia.com/img/cradle/multithreadingeparallelcomputingnel.ne.0_1315c/image_3.png" width="484" height="334" /&gt; &lt;/p&gt; &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.aspitalia.com/img/cradle/multithreadingeparallelcomputingnel.ne.0_1315c/image_6.png" width="485" height="193" /&gt; &lt;/p&gt; &lt;p&gt;Che dire. ci aspettano non solo mesi di articoli e succose novità, ma anche mesi in cui potremo sfruttare strumenti innovativi, in grado di darci una grande mano nel lavoro di tutti i giorni e, perché no, anche vantaggi sostanziali nelle potenzialità delle nostre applicazioni!&lt;/p&gt; &lt;p&gt;Ci vediamo su queste pagine!&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/C#_4_Guida_completa/" rel="tag"&gt;C# 4 Guida completa&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Basic_2010_Guida_completa/" rel="tag"&gt;Visual Basic 2010 Guida completa&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2607/Multithreading-Parallel-Computing-.NET-Framework-4.0.aspx"&gt;&lt;em&gt;Multithreading e parallel computing nel .NET Framework 4.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) 2012 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, C# 4 Guida completa, Visual Basic 2010 Guida completa, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2607/Multithreading-Parallel-Computing-.NET-Framework-4.0.aspx</guid><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2607/Multithreading-Parallel-Computing-.NET-Framework-4.0.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2607.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2607</trackback:ping></item><item><title>Rilasciato ASP.NET MVC 2 Beta</title><link>http://blogs.aspitalia.com/cradle/post2571/Rilasciato-ASP.NET-MVC-Beta.aspx</link><pubDate>Tue, 17 Nov 2009 23:58:01 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2571" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;I primi effetti di PDC iniziano a farsi vedere: è stata rilasciata oggi, infatti, la beta di ASP.NET MVC 2 (solo per VS2008) che introduce alcune novità rispetto alla Preview 2 presente in Visual Studio 2010 Beta 2. Cerchiamo di vedere cosa cambia e quali sono le nuove funzionalità disponibili con questa nuova versione:&lt;/p&gt; &lt;h3&gt;Validazione Client-side&lt;/h3&gt; &lt;p&gt;La Preview 2 già aveva introdotto un supporto built-in per la validazione client-side, utilizzando un opportuno plugin per jQuery. Nella versione Beta, invece, questa funzionalità è compresa all'interno delle librerie Javascript di Microsoft, pertanto è sufficiente includere&lt;/p&gt; &lt;ul&gt; &lt;li&gt;MicrosoftAjax.js &lt;/li&gt; &lt;li&gt;MicrosoftMVCAjax.js &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;e richiamare il metodo&lt;/p&gt; &lt;p&gt;&lt;code&gt;&amp;lt;% Html.EnableClientValidation(); %&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;dalla View, affinché tutto funzioni.&lt;/p&gt; &lt;h3&gt;Add Area&lt;/h3&gt; &lt;p&gt;Il menù contestuale di un progetto MVC all'interno del solution explorer consente adesso di aggiungere in maniera guidata una nuova area all'interno dell'applicazione. Ricordiamo che le Area altro non sono che una suddivisione logica del progetto stesso in più sottocartelle, una per ogni "modulo", all'interno delle quali trova posto la struttura di cartelle standard di MVC (Views, Controllers, Models)&lt;/p&gt; &lt;h3&gt;Modifiche al funzionamento dei TempData&lt;/h3&gt; &lt;p&gt;TempData, come già abbiamo indicato nello script &lt;a href="http://www.aspitalia.com/liste/usag/script.aspx?id=989"&gt;#989&lt;/a&gt;, consente di mantenere momentaneamente in uno storage (per default la session di ASP.NET) alcuni dati, che vengono poi automaticamente rimossi al ciclo di request response successivo. In MVC 2 Beta, invece, questi dati restano memorizzati fino al loro effettivo utilizzo, dopo di che vengono automaticamente marcati per l'eliminazione. Il metodo &lt;strong&gt;Keep&lt;/strong&gt; consente comunque di conservarli anche se sono stati utilizzati.&lt;/p&gt; &lt;h3&gt;Strong typed UI Helpers&lt;/h3&gt; &lt;p&gt;Già nelle preview 2 erano presenti i primi 3 esempi di UI Helpers (Editor, Label e Display) che, sfruttando le lambda expression, rendevano possibile la creazione di elementi di interfaccia collegati a proprietà del model in maniera strong typed e con il supporto di Intellisense e Refactoring di Visual Studio. Grazie ad essi, ad esempio, si può generare un elemento Input per una proprietà Descrizione del model tramite la sintassi&lt;/p&gt; &lt;p&gt;&lt;code&gt;&amp;lt;%= Html.EditorFor(m =&amp;gt; m.Descrizione) %&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;In questa nuova versione sono stati aggiunti anche&lt;/p&gt; &lt;ul&gt; &lt;li&gt;ValidationMessageFor &lt;/li&gt; &lt;li&gt;TextAreaFor &lt;/li&gt; &lt;li&gt;TextBoxFor &lt;/li&gt; &lt;li&gt;HiddenFor &lt;/li&gt; &lt;li&gt;DropDownListFor &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Esecuzione asincrona delle action tramite un AsyncController&lt;/h3&gt; &lt;p&gt;ASP.NET MVC 2 Beta introduce ufficialmente una interessantissima caratteristica che, fino ad oggi, è stata parte del progetto sperimentale ASP.NET MVC Futures. Tramite la classe base AsyncController, infatti, è ora possibile realizzare Action in grado di invocare metodi asincroni, la cui esecuzione viene presa in carico da un worker thread esterno a quello utilizzato da ASP.NET.&lt;/p&gt; &lt;h3&gt;Download&lt;/h3&gt; &lt;p&gt;Il download di questa nuova versione di ASP.NET MVC 2 è disponibile a &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;familyid=4817cdb2-88ea-4af4-a455-f06b4c90fd2c"&gt;questo link&lt;/a&gt;, dove trovate anche le note di rilascio. Un'ultima nota riguarda la compatibilità con le versioni di Visual Studio. E' supportato il solo Visual Studio 2008 SP1, quindi niente versione 2010 per il momento. Tra l'altro, visto che 2008 e 2010 condividono alcune componenti, l'installazione anche sul solo 2008 &lt;strong&gt;non è supportata se risulta installata anche la versione 2010 Beta 2&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Enjoy!&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_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/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2571/Rilasciato-ASP.NET-MVC-Beta.aspx"&gt;&lt;em&gt;Rilasciato ASP.NET MVC 2 Beta&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 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 4.0, ASP.NET MVC, Visual Studio, ASP.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2571/Rilasciato-ASP.NET-MVC-Beta.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2571/Rilasciato-ASP.NET-MVC-Beta.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2571.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2571</trackback:ping></item></channel></rss>
