<?xml version="1.0" encoding="iso-8859-15"?><feed version="0.3" 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/" xmlns="http://purl.org/atom/ns#" xml:lang="it-it"><title>Code and fun - Il blog di Matteo Casati</title><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/" /><tagline type="text/html">Code and fun - Il blog di Matteo Casati</tagline><id>http://blogs.aspitalia.com/matteo/</id><generator url="http://feed.aspitalia.com/" version="ASPItalia.com">feed.ASPItalia.com 'Weyoh' 4.8.828</generator><author><name>Code and fun - Il blog di Matteo Casati</name><url>http://blogs.aspitalia.com/matteo/</url></author><modified>2008-08-21T16:47:14+00:00</modified><entry><title>L'ordine dei parametri in alcune classi del framework</title><id>http://blogs.aspitalia.com/matteo/post2365/Lordine-Parametri-Classi-Framework.aspx</id><created>2008-08-21T16:47:14+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2365' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;...&amp;#232; deciso in modo casuale???&lt;/p&gt; &lt;p&gt;Qualcuno mi spiega perch&amp;#233; &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/sxykka64.aspx&quot;&gt;ArgumentException(string, string)&lt;/a&gt; vuole prima il messaggio e poi il nome del parametro mentre, ad esempio, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/k8a0dfcy.aspx&quot;&gt;ArgumentNullException(string, string)&lt;/a&gt; e &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/wx2cdec8.aspx&quot;&gt;ArgumentOutOfRangeException(string, string)&lt;/a&gt; funzionano al contrario (prima il nome del parametro e poi il messaggio?&lt;/p&gt; &lt;p&gt;Certe cose proprio non le capisco.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post2365/Lordine-Parametri-Classi-Framework.aspx"/><issued>2008-08-21T18:47:14+00:00</issued><modified>2008-08-21T18:47:14+00:00</modified><slash:comments>1</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post2365/Lordine-Parametri-Classi-Framework.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2365.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2365</trackback:ping></entry><entry><title>The Developer Highway Code</title><id>http://blogs.aspitalia.com/matteo/post2364/The-Developer-Highway-Code.aspx</id><created>2008-08-19T12:19:18+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2364' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;A corollario dei miei due articoli sulla sicurezza delle applicazioni ASP.NET pubblicati in gennaio (&amp;quot;&lt;a href=&quot;http://www.aspitalia.com/articoli/asp.net2/aspnet-security.aspx&quot;&gt;Realizzare applicazioni ASP.NET sicure - Prima parte&lt;/a&gt;&amp;quot; e &amp;quot;&lt;a href=&quot;http://www.aspitalia.com/articoli/asp.net2/aspnet-security-2.aspx&quot;&gt;Realizzare applicazioni ASP.NET sicure - Seconda parte&lt;/a&gt;&amp;quot;) segnalo la possibilit&amp;#224; di scaricare &lt;strong&gt;gratuitamente&lt;/strong&gt; da &lt;a href=&quot;http://msdn.microsoft.com/en-gb/default.aspx&quot;&gt;MSDN UK&lt;/a&gt; la versione digitale - e-book - dell'ottimo (seppur datato) &amp;quot;&lt;strong&gt;The Developer Highway Code&lt;/strong&gt;&amp;quot; di Paul Maher and Alex Mackman.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-gb/security/aa473878.aspx&quot;&gt;&lt;img height=&quot;243&quot; alt=&quot;the developer highway code&quot; src=&quot;http://blogs.aspitalia.com/img/m.casati/developerhighwaycode_bffb/the_developer_highway_code%20_5.jpg&quot; width=&quot;174&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;L'ebook &amp;#232; disponibile all'indirizzo &lt;a href=&quot;http://msdn.microsoft.com/en-gb/security/aa473878.aspx&quot;&gt;&lt;strong&gt;http://msdn.microsoft.com/en-gb/security/aa473878.aspx&lt;/strong&gt;&lt;/a&gt; (sia in formato PDF che XPS) ed &amp;#232; un aggiornamento della &lt;a href=&quot;http://www.amazon.com/developer-highway-code-paul-maher/dp/1905707584&quot;&gt;copia edita da Microsft Press&lt;/a&gt; nel 2006.&lt;/p&gt; &lt;p&gt;&amp;#200; possibile scegliere di scaricare la versione completa (circa 7 MB per il PDF) oppure ogni singola sezione:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Part 1 &amp;#8211; Security Engineering &lt;/li&gt; &lt;li&gt;Part 2 &amp;#8211; Checklists and Question Lists &lt;/li&gt; &lt;li&gt;Part 3 &amp;#8211; What&amp;#8217;s New for Security in the .NET Framework v2.0 &lt;/li&gt; &lt;li&gt;Part 4 &amp;#8211; Microsoft Patterns &amp;amp; Practices Security Resources &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Buona lettura a tutti.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/ASP.NET/&quot; rel=&quot;tag&quot;&gt;ASP.NET&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post2364/The-Developer-Highway-Code.aspx"/><issued>2008-08-19T14:19:18+00:00</issued><modified>2008-08-19T14:19:18+00:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post2364/The-Developer-Highway-Code.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2364.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2364</trackback:ping></entry><entry><title>RollingList&amp;lt;T&amp;gt;</title><id>http://blogs.aspitalia.com/matteo/post2355/RollingListT.aspx</id><created>2008-08-08T14:34:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2355' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Nel &lt;a href=&quot;http://blogs.aspitalia.com/matteo/post2352/Semplice-MA-Apparenza-Collection-Generica.aspx&quot;&gt;post precedente&lt;/a&gt; ho parlato di come utilizzare le classi di base del framework per realizzare una collection con le seguenti caratteristiche:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;all'inserimento di un nuovo elemento questo viene posizionato all'inizio della lista (i pi&amp;#249; recenti verranno visualizzati per primi) &lt;/li&gt;

  &lt;li&gt;la lista deve contenere al massimo &lt;em&gt;n&lt;/em&gt; elementi: l'inserimento di un nuovo elemento, raggiunto il limite &lt;em&gt;n&lt;/em&gt;, deve prevedere la rimozione dell'elemento pi&amp;#249; vecchio presente nella lista (ovvero quello inserito da pi&amp;#249; tempo) &lt;/li&gt;

  &lt;li&gt;garantire ottime performance &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://forum.aspitalia.com/forum/post/328680/Semplice-MA-Apparenza-Collection-Generica.aspx&quot;&gt;Il commento di rsaccav&lt;/a&gt;&lt;/strong&gt; mi ha fatto convinto ad implementare una collezione generica &amp;quot;&lt;em&gt;from scratch&lt;/em&gt;&amp;quot;, cos&amp;#236; da colmare il vuoto lasciato in System.Collection.Generic.&lt;/p&gt;

&lt;p&gt;Con estrema fantasia l'ho battezzata &lt;strong&gt;RollingList&amp;lt;T&amp;gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Il principio &amp;#232; piuttosto semplice: la lista si basa su un &lt;strong&gt;array con dimensione fissa&lt;/strong&gt; pari al limite di elementi da conservare (&lt;strong&gt;Capacity&lt;/strong&gt;; la propriet&amp;#224; deve essere impostata nel costruttore o comunque *prima* dell'inserimento del primo elemento) associato ad un &lt;strong&gt;cursore&lt;/strong&gt; (backward) che definisce la posizione di inserimento/sostituzione e che consente di enumerare gli elementi nell'ordine corretto.&lt;/p&gt;

&lt;p&gt;Il codice completo della classe:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;using System; 
    &lt;br /&gt;using System.Collections; 

    &lt;br /&gt;using System.Threading; 

    &lt;br /&gt;

    &lt;br /&gt;public class RollingList&amp;lt;T&amp;gt; : ICollection 

    &lt;br /&gt;{&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private int _cursor; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private int _size; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private int _capacity; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private T[] _items;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private object _syncRoot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public RollingList(int capacity) 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Capacity = capacity;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } 

    &lt;br /&gt;&lt;/code&gt;&lt;code&gt;
    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int Capacity 

    &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; get { return _capacity; } 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 

    &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; if (value &amp;lt;= 0) 

    &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentOutOfRangeException(&amp;quot;value&amp;quot;, &amp;quot;Capacity must be greater than zero&amp;quot;); 

    &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; if (_capacity &amp;gt; 0) 

    &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentException(&amp;quot;Capacity has just been defined&amp;quot;, &amp;quot;value&amp;quot;); 

    &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; _capacity = value; 

    &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; _items = new T[_capacity]; 

    &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; _cursor = (_capacity - 1); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160; &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public void Add(T item) 

    &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; if (_capacity &amp;lt;= 0) 

    &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; throw new NotSupportedException(&amp;quot;Capacity is not greater than zero&amp;quot;); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _items[_cursor--] = item; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (_size &amp;lt; _capacity) 

    &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; _size++; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (_cursor &amp;lt; 0) 

    &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; _cursor = (_capacity - 1); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public void Clear() 

    &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; Array.Clear(_items, 0, _size); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _size = 0; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _cursor = (_capacity - 1); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public T[] ToArray() 

    &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; T[] destinationArray = new T[_size];&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (_size == 0) 

    &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; return destinationArray; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int cursorPosition = (_cursor + 1 == _capacity) ? 0 : _cursor + 1; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Array.Copy(_items, cursorPosition, destinationArray, 0, (_capacity - cursorPosition)); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (_size == _capacity &amp;amp;&amp;amp; cursorPosition &amp;gt; 0) 

    &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; Array.Copy(_items, 0, destinationArray, (_capacity - cursorPosition), cursorPosition); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return destinationArray; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } 

    &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public void CopyTo(Array array, int index) 

    &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; Array.Copy(ToArray(), 0, array, index, _size); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int Count 

    &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; get { return _size; } 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public bool IsSynchronized 

    &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; get { return false; } 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public object SyncRoot 

    &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; get 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 

    &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; if (_syncRoot == null) 

    &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; { 

    &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interlocked.CompareExchange(ref _syncRoot, new object(), null); 

    &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; } 

    &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; return _syncRoot; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public IEnumerator GetEnumerator() 

    &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 ToArray().GetEnumerator(); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } 

    &lt;br /&gt;}&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Questa implementazione &amp;#232; sicuramente migliorabile (ad esempio, oltre a &lt;em&gt;ICollection&lt;/em&gt; potrebbe essere utile implementare l'interfaccia &lt;em&gt;ICollection&amp;lt;T&amp;gt;&lt;/em&gt;, supportare la serializzazione, ecc.) ma &amp;#232; decisamente preferibile rispetto all'uso di Stack&amp;lt;T&amp;gt;, Queue&amp;lt;T&amp;gt; o LinkedList&amp;lt;T&amp;gt; in quanto:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&amp;#160;&lt;strong&gt;semplifica il codice di inserimento&lt;/strong&gt; di elementi (le operazioni di IN/OUT al raggiungimento della capacit&amp;#224; massima definita sono gestite dalla collection stessa, quindi non richiedono codice di controllo aggiuntivo) &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;semplifica la lettura&lt;/strong&gt; grazie ad una corretta enumerazione nativa degli elementi &lt;/li&gt;

  &lt;li&gt;permette di avere &lt;strong&gt;performance notevolmente pi&amp;#249; elevate&lt;/strong&gt;: &lt;/li&gt;
&lt;/ol&gt;
&lt;code&gt;// 
  &lt;br /&gt;// RollingList performance test 

  &lt;br /&gt;// 

  &lt;br /&gt;int capacity = 10000; 

  &lt;br /&gt;int max = 1000000000; 

  &lt;br /&gt;DateTime start = DateTime.Now; 

  &lt;br /&gt;RollingList&amp;lt;int&amp;gt; list = new RollingList&amp;lt;int&amp;gt;(capacity); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; list.Add(i); 

  &lt;br /&gt;} 

  &lt;br /&gt;foreach (int item in list) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // do something with &amp;quot;item&amp;quot; 

  &lt;br /&gt;} 

  &lt;br /&gt;Console.WriteLine(&amp;quot;RollingList: max={0} -&amp;gt; {1}&amp;quot;, 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; max.ToString(&amp;quot;#,###&amp;quot;), 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DateTime.Now.Subtract(start)); &lt;/code&gt;

&lt;p&gt;Produce: &lt;/p&gt;

&lt;p&gt;RollingList: max=1.000.000.000 -&amp;gt; 00:00:11.5610000&lt;/p&gt;

&lt;p&gt;Ovvero un tempo di esecuzione che &amp;#232; circa &lt;strong&gt;un terzo&lt;/strong&gt; rispetto a Queue&amp;lt;T&amp;gt;!!!&lt;/p&gt;

&lt;p&gt;HTH&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post2355/RollingListT.aspx"/><issued>2008-08-08T16:34:00+00:00</issued><modified>2008-08-08T16:34:00+00:00</modified><slash:comments>9</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post2355/RollingListT.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2355.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2355</trackback:ping></entry><entry><title>Una semplice (ma solo in apparenza) collection generica</title><id>http://blogs.aspitalia.com/matteo/post2352/Semplice-MA-Apparenza-Collection-Generica.aspx</id><created>2008-07-31T13:54:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2352' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Nel progetto (Web) a cui sto lavorando &amp;#232; stata richiesta la visualizzazione di una lista di elementi con le seguenti caratteristiche:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;i nuovi elementi devono essere inseriti all'inizio dell'elenco (i pi&amp;#249; recenti verranno visualizzati per primi) &lt;/li&gt;

  &lt;li&gt;la lista deve contenere al massimo &lt;em&gt;n&lt;/em&gt; elementi: l'inserimento di un nuovo elemento, raggiunto il limite &lt;em&gt;n&lt;/em&gt;, deve prevedere la rimozione dell'elemento pi&amp;#249; vecchio presente nella lista (ovvero quello inserito da pi&amp;#249; tempo) &lt;/li&gt;

  &lt;li&gt;l'aggiunta di nuovi elementi &amp;#232; corposa (centinaia di insert al secondo per tutto il ciclo di vita dell'applicazione) &lt;/li&gt;

  &lt;li&gt;il limite del numero massimo di elementi che devono essere mantenuti nella lista (&lt;em&gt;n&lt;/em&gt;) &amp;#232; relativamente basso (&amp;lt; 10.000) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In pratica, definito un limite di 3 elementi e immaginando l'accodamento dei primi 5 interi in ordine crescente (1, 2, 3, 4 e 5) il risultato atteso &amp;#232;:&lt;/p&gt;
1 

&lt;br /&gt;2 1 

&lt;br /&gt;3 2 1 

&lt;br /&gt;4 3 2 

&lt;br /&gt;5 4 3 

&lt;p&gt;Ho pensato che sia una cosa semplicissima da realizzare in .NET sfruttando le classi in System.Collection.Generic ma... quale usare? Il framework prevede infatti:&lt;/p&gt;

&lt;h3&gt;List&amp;lt;T&amp;gt; &lt;/h3&gt;

&lt;p&gt;Lista generica, non utilizzabile allo scopo in quanto non &amp;#232; possibile inserire elementi in posizioni specifiche ma solo &amp;quot;to the end of the List(T)&amp;quot;.&lt;/p&gt;

&lt;p&gt;In realt&amp;#224; sarebbe possibile effettuare l'inserimento all'inizio della lista effettuando uno shift di tutti gli elementi ma le performance sarebbero improponibili!&lt;/p&gt;

&lt;h3&gt;Stack&amp;lt;T&amp;gt;&lt;/h3&gt;

&lt;p&gt;&amp;#200; letteralmente un insieme di elementi &amp;quot;impilati&amp;quot;; possiamo vederlo come una vaschetta portadocumenti sulla scrivania in cui vengono aggiunte delle pratiche (Push) semplicemente appoggiandole sopra e con l'impiegato che le processa che prende (Pop) il primo foglio che trova in cima alla pigna. Non assolve dunque allo scopo in quanto rimuove gli elementi pi&amp;#249; &amp;quot;nuovi&amp;quot; anzich&amp;#233; quelli pi&amp;#249; &amp;quot;vecchi&amp;quot;.&lt;/p&gt;

&lt;p&gt;In pratica il seguente codice:&lt;/p&gt;
&lt;code&gt;int capacity = 3; 
  &lt;br /&gt;int max = 5; 

  &lt;br /&gt;Stack&amp;lt;int&amp;gt; list = new Stack&amp;lt;int&amp;gt;(capacity); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (list.Count &amp;gt;= capacity) 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list.Pop(); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; list.Push(i); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; foreach (var item in list) 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.Write(&amp;quot;{0} &amp;quot;, item); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(); 

  &lt;br /&gt;}&lt;/code&gt; 

&lt;p&gt;Produce:&lt;/p&gt;

&lt;p&gt;1 
  &lt;br /&gt;2 1 

  &lt;br /&gt;3 2 1 

  &lt;br /&gt;4 2 1 

  &lt;br /&gt;5 2 1&lt;/p&gt;

&lt;p&gt;Non ci siamo.&lt;/p&gt;

&lt;h3&gt;Queue&amp;lt;T&amp;gt;&lt;/h3&gt;

&lt;p&gt;&amp;#200; appunto una &amp;quot;coda&amp;quot; dove il primo elemento inserito (Enqueue) &amp;#232; anche il primo a venire rimosso (Dequeue); l'analogia che mi viene in mente &amp;#232; quella delle macchine ferme al casello dell'autostrada: il primo arrivato sar&amp;#224; anche il primo a superare la barriera. Questa collection assolve per met&amp;#224; allo scopo garantendo il corretto meccanismo di in/out ma ha il contro di presentare l'enumerazione degli elementi in ordine inverso rispetto a quanto richiesto (scorrendo la collection ottengo prima gli elementi pi&amp;#249; &amp;quot;vecchi&amp;quot; e poi quelli pi&amp;#249; &amp;quot;nuovi&amp;quot;)&lt;/p&gt;

&lt;p&gt;In pratica il seguente codice:&lt;/p&gt;
&lt;code&gt;int capacity = 3; 
  &lt;br /&gt;int max = 5; 

  &lt;br /&gt;Queue&amp;lt;int&amp;gt; list = new Queue&amp;lt;int&amp;gt;(capacity); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (list.Count &amp;gt;= capacity) 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list.Dequeue(); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; list.Enqueue(i); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; foreach (var item in list) 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.Write(&amp;quot;{0} &amp;quot;, item); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(); 

  &lt;br /&gt;}&lt;/code&gt; 

&lt;p&gt;Produce:&lt;/p&gt;

&lt;p&gt;1 
  &lt;br /&gt;1 2 

  &lt;br /&gt;1 2 3 

  &lt;br /&gt;2 3 4 

  &lt;br /&gt;3 4 5&lt;/p&gt;

&lt;p&gt;Non ci siamo ancora ma manca poco :-)&lt;/p&gt;

&lt;h3&gt;LinkedList&amp;lt;T&amp;gt;&lt;/h3&gt;

&lt;p&gt;Si tratta di un elenco con doppio collegamento; espone metodi per l'inserimento di nuovi elementi sia all'inizio dell'elenco (AddFirst) che alla fine (AddLast) che in posizioni intermedie (AddAfter e AddBefore), sia per la rimozione (RemoveFirst, RemoveLast, Remove), dandoci la massima flessibilit&amp;#224; possibile. In pratica possiamo immaginare questa collection come un trenino giocattolo: possiamo aggiungere o togliere vagoni da entrambe le estremit&amp;#224; del convoglio in modo del tutto indifferente.&lt;/p&gt;

&lt;p&gt;In pratica il seguente codice:&lt;/p&gt;
&lt;code&gt;int capacity = 3; 
  &lt;br /&gt;int max = 5; 

  &lt;br /&gt;LinkedList&amp;lt;int&amp;gt; list = new LinkedList&amp;lt;int&amp;gt;(); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (list.Count &amp;gt;= capacity) 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list.RemoveLast(); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; list.AddFirst(i); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; foreach (var item in list) 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.Write(&amp;quot;{0} &amp;quot;, item); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(); 

  &lt;br /&gt;}&lt;/code&gt; 

&lt;p&gt;Produce:&lt;/p&gt;

&lt;p&gt;1 
  &lt;br /&gt;2 1 

  &lt;br /&gt;3 2 1 

  &lt;br /&gt;4 3 2 

  &lt;br /&gt;5 4 3&lt;/p&gt;

&lt;p&gt;Missione compiuta? Sembrerebbe di s&amp;#236;.&lt;/p&gt;

&lt;p&gt;Per scrupolo ho fatto un piccolo test di performance, aspettandomi prestazioni simili per Queue e LinkedList:&lt;/p&gt;
&lt;code&gt;// 
  &lt;br /&gt;// Performance test configuration 

  &lt;br /&gt;// 

  &lt;br /&gt;DateTime start; 

  &lt;br /&gt;int[] results; 

  &lt;br /&gt;int capacity = 10000; 

  &lt;br /&gt;int max = 1000000000; 

  &lt;br /&gt;

  &lt;br /&gt;// 

  &lt;br /&gt;// LinkedList performance test 

  &lt;br /&gt;// 

  &lt;br /&gt;start = DateTime.Now; 

  &lt;br /&gt;LinkedList&amp;lt;int&amp;gt; list = new LinkedList&amp;lt;int&amp;gt;(); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (list.Count &amp;gt;= capacity) 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list.RemoveLast(); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; list.AddFirst(i); 

  &lt;br /&gt;} 

  &lt;br /&gt;results = new int[list.Count]; 

  &lt;br /&gt;list.CopyTo(results, 0); 

  &lt;br /&gt;foreach (int item in results) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // do something with &amp;quot;item&amp;quot; 

  &lt;br /&gt;} 

  &lt;br /&gt;Console.WriteLine(&amp;quot;LinkedList: max={0} -&amp;gt; {1}&amp;quot;, 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; max.ToString(&amp;quot;#,###&amp;quot;), 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DateTime.Now.Subtract(start)); 

  &lt;br /&gt;

  &lt;br /&gt;// 

  &lt;br /&gt;// Queue performance test 

  &lt;br /&gt;// 

  &lt;br /&gt;start = DateTime.Now; 

  &lt;br /&gt;results = null; 

  &lt;br /&gt;Queue&amp;lt;int&amp;gt; queue = new Queue&amp;lt;int&amp;gt;(capacity); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (queue.Count &amp;gt;= capacity) 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; queue.Dequeue(); 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; queue.Enqueue(i); 

  &lt;br /&gt;} 

  &lt;br /&gt;results = queue.ToArray(); 

  &lt;br /&gt;foreach (int item in results) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // do something with &amp;quot;item&amp;quot; 

  &lt;br /&gt;} 

  &lt;br /&gt;Console.WriteLine(&amp;quot;Queue: max={0} -&amp;gt; {1}&amp;quot;, 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; max.ToString(&amp;quot;#,###&amp;quot;), 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DateTime.Now.Subtract(start));&lt;/code&gt; 

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Sebbene questo tipo di misurazione sia piuttosto &amp;quot;spannometrico&amp;quot;, il risultato (per un miliardo di inserimenti a fronte di una lista con al pi&amp;#249; 10.000 items) mi ha lasciato basito:&lt;/p&gt;

&lt;p&gt;LinkedList: max=1.000.000.000 -&amp;gt; 00:01:17.6770000 
  &lt;br /&gt;Queue: max=1.000.000.000 -&amp;gt; 00:00:30.4030000&lt;/p&gt;

&lt;p&gt;Ovvero LinkedList richiede circa 2.5 volte il tempo necessario a Queue!&lt;/p&gt;

&lt;h3&gt;Conclusioni&lt;/h3&gt;

&lt;p&gt;Sebbene LinkedList&amp;lt;T&amp;gt; faccia il suo &amp;quot;sporco lavoro&amp;quot; lo fa... &lt;strong&gt;troppo lentamente!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alla fine ho dunque optato per l'utilizzo di Queue&amp;lt;T&amp;gt; con l'aggiunta di poche righe di codice per leggere in modo inverso il contenuto enumerato della lista:&lt;/p&gt;
&lt;code&gt;Queue&amp;lt;int&amp;gt; queue = new Queue&amp;lt;int&amp;gt;(capacity); 
  &lt;br /&gt;// (codice omesso) 

  &lt;br /&gt;List&amp;lt;int&amp;gt; temp = new List&amp;lt;int&amp;gt;(queue.ToArray()); 

  &lt;br /&gt;temp.Reverse(); 

  &lt;br /&gt;results = temp.ToArray(); 

  &lt;br /&gt;foreach (int item in results) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // do something with &amp;quot;item&amp;quot; 

  &lt;br /&gt;}&lt;/code&gt; 

&lt;p&gt;Infatti il numero di elementi mantenuti nella coda &amp;#232; decisamente troppo basso - meno di 10.000 - per risultare influenti le operazioni di copia in una List e di reverse della lista, anche se molto probabilmente questa porzione di codice potrebbe essere migliorata :-)&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;PS 1: qualcuno avr&amp;#224; notato l'assenza di acronimi come FIFO (first-in, first-out), LIFO (last-in, first-out), ecc. 
  &lt;br /&gt;Sono stati volutamente omessi perch&amp;#233; il significato di &amp;quot;primo&amp;quot; e &amp;quot;ultimo&amp;quot; mi &amp;#232; risultato, leggendo qua e l&amp;#224; sul Web, interpretato in modo non del tutto univoco (si riferisce all'ordine di inserimento? alla posizione che assume l'elemento nella collection? ad altro?)&lt;/p&gt;

&lt;p&gt;PS 2: un doveroso grazie a &lt;a href=&quot;http://blogs.aspitalia.com/ricciolo/&quot;&gt;Cristian&lt;/a&gt; e a &lt;a href=&quot;http://blogs.aspitalia.com/nostromo/&quot;&gt;Marco&lt;/a&gt; che mi hanno &lt;strike&gt;supportato&lt;/strike&gt; sopportato in questa ricerca&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post2352/Semplice-MA-Apparenza-Collection-Generica.aspx"/><issued>2008-07-31T15:54:00+00:00</issued><modified>2008-07-31T15:54:00+00:00</modified><slash:comments>15</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post2352/Semplice-MA-Apparenza-Collection-Generica.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2352.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2352</trackback:ping></entry><entry><title>IDictionary e la serializzazione in XML</title><id>http://blogs.aspitalia.com/matteo/post2330/IDictionary-Serializzazione-XML.aspx</id><created>2008-07-17T12:37:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2330' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Chi lavora con i Web Service si sar&#224; accorto che le strutture chiave/valore (Hashtable, Dictionary generici o specializzati, ecc.), non implementando l'interfaccia &lt;a title=&quot;IXmlSerializable&quot; href=&quot;http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx&quot;&gt;IXmlSerializable&lt;/a&gt; risultano &amp;quot;intrasportabili&amp;quot;.&lt;/p&gt;&lt;p&gt;Qualcuno ci ha anche &lt;a href=&quot;http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=95599&quot;&gt;provato a chiedere a Microsoft&lt;/a&gt; di modificare questo comportamento ma la risposta &#232; stata &amp;quot;Won't fix&amp;quot;... La motivazione? Semplice: &amp;quot;&lt;em&gt;Unfortunately, we cannot change Dictionary&amp;lt;K,V&amp;gt; to implement IXmlSerializable since it is located in the mscorlib assembly that cannot reference System.Xml.dll.&lt;/em&gt;&amp;quot;&lt;/p&gt;&lt;p&gt;In realt&#224; creare un Dictionary generico serializzabile in XML &#232; piuttosto semplice: basta creare una classe &amp;quot;SerializableDictionary&amp;quot; che derivi da Dictionary&amp;lt;TKey, TValue&amp;gt; e implementi IXmlSerializable, serializzando - per ogni KeyValuePair contenuto nella collection di base - sia la chiave che il valore.&lt;/p&gt;&lt;p&gt;Ho fatto due implementazioni: la prima serializza le chiavi e i valori in Base64, la seconda in XML.&lt;/p&gt;&lt;h3&gt;KeyValuePair in Base64&lt;/h3&gt;&lt;p&gt;using System;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Xml;&lt;br /&gt;using System.Xml.Schema;&lt;br /&gt;using System.Xml.Serialization;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Runtime.Serialization.Formatters;&lt;br /&gt;using System.Runtime.Serialization.Formatters.Binary; &lt;/p&gt;&lt;p&gt;[Serializable]&lt;br /&gt;public class SerializableDictionary&amp;lt;TKey, TValue&amp;gt; : Dictionary&amp;lt;TKey, TValue&amp;gt;, IXmlSerializable&lt;br /&gt;{&lt;br /&gt;&#160;&#160;&#160; #region IXmlSerializable Members &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; private const string NS = &amp;quot;&amp;quot;;&lt;br /&gt;&#160;&#160;&#160; private const string XML_ITEM_NODE_NAME = &amp;quot;item&amp;quot;;&lt;br /&gt;&#160;&#160;&#160; private const string XML_KEY_ATTRIBUTE_NAME = &amp;quot;key&amp;quot;;&lt;br /&gt;&#160;&#160;&#160; private const string XML_VALUE_ATTRIBUTE_NAME = &amp;quot;value&amp;quot;; &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; public XmlSchema GetSchema()&lt;br /&gt;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return null;&lt;br /&gt;&#160;&#160;&#160; } &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; public void WriteXml(XmlWriter w)&lt;br /&gt;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach (TKey key in Keys)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TValue value = this[key];&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; w.WriteStartElement(XML_ITEM_NODE_NAME, NS);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; w.WriteElementString(XML_KEY_ATTRIBUTE_NAME, NS, ToBase64(key));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; w.WriteElementString(XML_VALUE_ATTRIBUTE_NAME, NS, ToBase64(value));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; w.WriteEndElement();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160; } &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; public void ReadXml(XmlReader r)&lt;br /&gt;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; r.Read();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; r.MoveToContent();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; while (r.NodeType != XmlNodeType.EndElement)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; r.ReadStartElement(XML_ITEM_NODE_NAME, NS);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TKey key = FromBase64&amp;lt;TKey&amp;gt;(r.ReadElementString(XML_KEY_ATTRIBUTE_NAME, NS));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TValue value = FromBase64&amp;lt;TValue&amp;gt;(r.ReadElementString(XML_VALUE_ATTRIBUTE_NAME, NS));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; r.ReadEndElement();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; r.MoveToContent();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Add(key, value);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160; } &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; #endregion &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; #region Base64 Serialization &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; private static string ToBase64(object value)&lt;br /&gt;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; using (MemoryStream stream = new MemoryStream())&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; BinaryFormatter formatter = new BinaryFormatter();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; formatter.Serialize(stream, value);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; byte[] buffer = stream.ToArray();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return Convert.ToBase64String(buffer, 0, buffer.Length, Base64FormattingOptions.None);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160; } &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; public static T FromBase64&amp;lt;T&amp;gt;(string base64)&lt;br /&gt;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; byte[] buffer = Convert.FromBase64String(base64);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; using (MemoryStream stream = new MemoryStream(buffer))&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; BinaryFormatter formatter = new BinaryFormatter();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return (T)formatter.Deserialize(stream);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160; } &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; #endregion&lt;br /&gt;} &lt;/p&gt;&lt;h3&gt;KeyValuePair in XML&lt;/h3&gt;&lt;p&gt;using System;&lt;br /&gt;using System.Xml;&lt;br /&gt;using System.Xml.Schema;&lt;br /&gt;using System.Xml.Serialization;&lt;br /&gt;using System.Collections.Generic; &lt;/p&gt;&lt;p&gt;[Serializable]&lt;br /&gt;public class SerializableDictionary&amp;lt;TKey, TValue&amp;gt; : Dictionary&amp;lt;TKey, TValue&amp;gt;, IXmlSerializable&lt;br /&gt;{&lt;br /&gt;&#160;&#160;&#160; #region IXmlSerializable Members &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; private const string NS = &amp;quot;&amp;quot;;&lt;br /&gt;&#160;&#160;&#160; private const string XML_ITEM_NODE_NAME = &amp;quot;item&amp;quot;;&lt;br /&gt;&#160;&#160;&#160; private const string XML_KEY_NODE_NAME = &amp;quot;key&amp;quot;;&lt;br /&gt;&#160;&#160;&#160; private const string XML_VALUE_NODE_NAME = &amp;quot;value&amp;quot;; &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; public XmlSchema GetSchema()&lt;br /&gt;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return null;&lt;br /&gt;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160; public void ReadXml(XmlReader reader)&lt;br /&gt;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; XmlSerializer ks = new XmlSerializer(typeof(TKey));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; XmlSerializer vs = new XmlSerializer(typeof(TValue));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; bool wasEmpty = reader.IsEmptyElement;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; reader.Read();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (wasEmpty)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; while (reader.NodeType != XmlNodeType.EndElement)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; reader.ReadStartElement(XML_ITEM_NODE_NAME, NS);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; reader.ReadStartElement(XML_KEY_NODE_NAME, NS);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TKey key = (TKey)ks.Deserialize(reader);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; reader.ReadEndElement();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; reader.ReadStartElement(XML_VALUE_NODE_NAME, NS);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TValue value = (TValue)vs.Deserialize(reader);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; reader.ReadEndElement();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Add(key, value);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; reader.ReadEndElement();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; reader.MoveToContent();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; reader.ReadEndElement();&lt;br /&gt;&#160;&#160;&#160; } &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; public void WriteXml(XmlWriter writer)&lt;br /&gt;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; XmlSerializer ks = new XmlSerializer(typeof(TKey));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; XmlSerializer vs = new XmlSerializer(typeof(TValue));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach (TKey key in Keys)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; writer.WriteStartElement(XML_ITEM_NODE_NAME, NS);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; writer.WriteStartElement(XML_KEY_NODE_NAME, NS);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ks.Serialize(writer, key);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; writer.WriteEndElement();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; writer.WriteStartElement(XML_VALUE_NODE_NAME, NS);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TValue value = this[key];&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; vs.Serialize(writer, value);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; writer.WriteEndElement();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; writer.WriteEndElement();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160; } &lt;/p&gt;&lt;p&gt;&#160;&#160;&#160; #endregion&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&#160;&lt;/p&gt;&lt;p&gt;A voi la scelta :-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Web_Service/&quot; rel=&quot;tag&quot;&gt;Web Service&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XML/&quot; rel=&quot;tag&quot;&gt;XML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post2330/IDictionary-Serializzazione-XML.aspx"/><issued>2008-07-17T14:37:00+00:00</issued><modified>2008-07-17T14:37:00+00:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post2330/IDictionary-Serializzazione-XML.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2330.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2330</trackback:ping></entry><entry><title>Grazie ASPItalia!</title><id>http://blogs.aspitalia.com/matteo/post2328/ASPItalia.aspx</id><created>2008-07-16T15:11:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2328' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Un grazie enorme a &lt;a title=&quot;Daniele&quot; href=&quot;http://blogs.aspitalia.com/daniele/&quot;&gt;Daniele&lt;/a&gt;. Lui sa perch&#233;!&lt;/p&gt;&lt;p&gt;&lt;em&gt;(chiedo scusa per l'OT e per la cripticit&#224; del messaggio ma... quando ci vuole ci vuole)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/10annidi/&quot; rel=&quot;tag&quot;&gt;10annidi&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ASPItalia.com/&quot; rel=&quot;tag&quot;&gt;ASPItalia.com&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post2328/ASPItalia.aspx"/><issued>2008-07-16T17:11:00+00:00</issued><modified>2008-07-16T17:11:00+00:00</modified><slash:comments>1</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post2328/ASPItalia.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2328.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2328</trackback:ping></entry><entry><title>3-Tier, 3-Layer e MVC: ma sono la stessa cosa?</title><id>http://blogs.aspitalia.com/matteo/post2318/3Tier-3Layer-MVC-Cosa.aspx</id><created>2008-07-10T15:46:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2318' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Questa riflessione parte dalla domanda di un utente nel forum:&lt;/p&gt;&lt;cite&gt;&amp;quot;&lt;a href=&quot;http://forum.aspitalia.com/forum/post/326672/Domanda-Analogie-MVC-Threetier.aspx&quot;&gt;Domanda: Analogie tra MVC e Three-tier&lt;/a&gt; - Sono troppe e a me sembra che l'uno possa sostituire l'altro.. ma quanto sbaglio?&amp;quot;&lt;/cite&gt; &lt;p&gt;Ho l'impressione che questa perplessit&#224; sia parecchio diffusa e che, pi&#249; in generale, ci sia parecchia confusione quando si parla di software architecture: spero che questo post possa chiarire un po' meglio alcuni concetti.&lt;/p&gt;&lt;p&gt;Iniziamo definendo, in termini strettamente lessicali, cosa si intende per &amp;quot;3-Tier&amp;quot;, dato che la stessa Wikipedia non &#232; affatto chiara n&#232; precisa (sia in &lt;a href=&quot;http://it.wikipedia.org/wiki/Architettura_three-tier&quot;&gt;italiano&lt;/a&gt; che in &lt;a href=&quot;http://en.wikipedia.org/wiki/Three-tier_%28computing%29&quot;&gt;inglese&lt;/a&gt;) contribuendo ad aumentare la confusione.&lt;/p&gt;&lt;h2&gt;Architettura 3-Tier (o n-Tier)&lt;/h2&gt;&lt;p&gt;Letteralmente si parla di &amp;quot;architetture a 3 o pi&#249; livelli&amp;quot; per definire un modello che fornisca una &lt;b&gt;separazione fisica&lt;/b&gt; dell'applicazione; in pratica si dice che un'applicazione pu&#242; essere erogata usando un'infrastruttura complessa e diversificata, tipicamente usando pi&#249; server, ciascuno dedicato ad una funzionalit&#224; specifica (fron-end, middleware, back-end, ecc.)&lt;br /&gt;Una spiegazione pi&#249; dettagliata di questo modello distributivo &#232; disponibile sul sito &amp;quot;Microsoft patterns &amp;amp; practices Developer Center&amp;quot;: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms978694.aspx&quot;&gt;Three-Tiered Distribution&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In pratica ritengo che si dovrebbe parlare di &amp;quot;tier&amp;quot; in riferimento a qualcosa di &amp;quot;sistemistico&amp;quot;, e non per architettura software in senso stretto.&lt;/p&gt;&lt;h2&gt;Architettura 3-Layer (o n-Layer)&lt;/h2&gt;&lt;p&gt;Le architetture a 3 strati (o pi&#249;: il &amp;quot;3&amp;quot; &#232; entrato nella concezione comune in quanto rappresenta la stratificazione pi&#249; semplice ed utilizzata) sono un modello di organizzazione del codice applicativo basato sulla separazione delle funzionalit&#224; logiche. Tipicamente avremo:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Presentation (PL)&lt;/b&gt;: la visualizzazione dei dati e, pi&#249; in generale, la rappresentazione dei controlli (forms, controlli di input, labels, ecc.) necessari per l'interfaccia utente &lt;/li&gt;&lt;li&gt;&lt;b&gt;Business Logic (BLL)&lt;/b&gt;: rappresenta la parte principale dell'applicazione, definendo il &lt;b&gt;domain model&lt;/b&gt; dell'applicazione, ovvero le entit&#224; (ad esempio: fattura, cliente, ecc.), le loro relazioni e le logiche applicative. Non deve contenere contenere alcun riferimento a come i dati saranno presentati all'utente o a come verranno salvati &lt;/li&gt;&lt;li&gt;&lt;b&gt;Data Access (DAL)&lt;/b&gt;: contiene tutto quello che concerne la persistenza dei dati (database, tabelle, record, file system, ecc.) &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Questo tipo di architettura ha principalmente il vantaggio di fornire una &lt;b&gt;separazione logica&lt;/b&gt; cos&#236; da aumentarne la manutenibilit&#224;, la scalabilit&#224; ed il riutilizzo.&lt;br /&gt;Una spiegazione pi&#249; dettagliata di questo tipo di architettura &#232; disponibile sul sito &amp;quot;Microsoft patterns &amp;amp; practices Developer Center&amp;quot;: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms978689.aspx&quot;&gt;Three-Layered Services Application&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Model-View-Controller (MVC)&lt;/h2&gt;&lt;p&gt;Questo pattern, introdotto solo di recente nel mondo .NET ma diffuso da tempo in altri ambienti, fornisce un modello per strutturare in modo organizzato le funzionalit&#224; relative alla UI e orchestrare l'accesso agli altri strati applicativi (BLL e DAL):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Model&lt;/b&gt;: &#232; l'insieme dei componenti che mantengono lo &amp;quot;stato&amp;quot;: i dati e i metodi per accedervi. In pratica costituisce la logica applicativa o - IMHO preferibilmente - l'accesso al layer (separato) di BL &lt;/li&gt;&lt;li&gt;&lt;b&gt;View&lt;/b&gt;: deputato alla visualizzazione vera e propria dell'interfaccia utente per la presentazione dei dati &lt;/li&gt;&lt;li&gt;&lt;b&gt;Controller&lt;/b&gt;: gestisce le interazioni dell'utente con l'applicazione (tipicamente intercettando e gestendo gli eventi e gli input dell'utente), mediante accesso al Model e definendo la View corrispondente da presentare &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;MVC non contraddice quindi il modello 3-Layer, semplicemente &#232; una delle possibili implementazioni di questo tipo di architettura; da un certo punto di vista possiamo addirittura vedere MVC come un'estensione dell'architettura a 3 strati, in quanto porta una separazione logica ulteriore nel livello di presentation.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MVC &#232; dunque un'alternativa ai Web Forms di ASP.NET&lt;/strong&gt; e, come tale, ha vantaggi e svantaggi. &lt;/p&gt;&lt;p&gt;Per quanto mi riguarda (non ne faccio mistero: il modello a forms ASP.NET non mi &#232; mai piaciuto per tanti motivi) MVC ha solo vantaggi :-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Architettura/&quot; rel=&quot;tag&quot;&gt;Architettura&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ASP.NET/&quot; rel=&quot;tag&quot;&gt;ASP.NET&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post2318/3Tier-3Layer-MVC-Cosa.aspx"/><issued>2008-07-10T17:46:00+00:00</issued><modified>2008-07-10T17:46:00+00:00</modified><slash:comments>1</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post2318/3Tier-3Layer-MVC-Cosa.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2318.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2318</trackback:ping></entry><entry><title>Test: che programmatore sei?</title><id>http://blogs.aspitalia.com/matteo/post2074/Test-Programmatore-Sei.aspx</id><created>2007-06-06T13:27:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2074' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Visto che oggi&#160;va tanto di moda questo test, ho pensato di proporlo anche ai bloggers di ASPItalia: &lt;a title=&quot;Programmer Personality Test&quot; href=&quot;http://www.doolwind.com/index.php?page=11&quot; target=&quot;_blank&quot;&gt;Programmer Personality Test&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Io sono un &lt;strong&gt;&lt;em&gt;DHSB&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;You're a &lt;font size=&quot;5&quot;&gt;D&lt;/font&gt;oer.&lt;br /&gt;&lt;/strong&gt;You are very quick at getting tasks done. You believe the outcome is the most important part of a task and the faster you can reach that outcome the better. After all, time is money.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;You like coding at a &lt;font size=&quot;5&quot;&gt;H&lt;/font&gt;igh level.&lt;/b&gt;&lt;br /&gt;The world is made up of objects and components, you should create your programs in the same way.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;You work best in a &lt;font size=&quot;5&quot;&gt;S&lt;/font&gt;olo situation.&lt;/b&gt;&lt;br /&gt;The best way to program is by yourself. There's no communication problems, you know every part of the code allowing you to write the best programs possible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;You are a li&lt;font size=&quot;5&quot;&gt;B&lt;/font&gt;eral programmer.&lt;/b&gt;&lt;br /&gt;Programming is a complex task and you should use white space and comments as freely as possible to help simplify the task. We're not writing on paper anymore so we can take up as much room as we need.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;E voi che tipi siete?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post2074/Test-Programmatore-Sei.aspx"/><issued>2007-06-06T15:27:00+00:00</issued><modified>2007-06-06T15:27:00+00:00</modified><slash:comments>5</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post2074/Test-Programmatore-Sei.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2074.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2074</trackback:ping></entry><entry><title>Italia.it &amp;#232; online</title><id>http://blogs.aspitalia.com/matteo/post1973/Italia.it-Online.aspx</id><created>2007-02-23T14:06:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1973' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Dopo una lunga gestazione &#232; online il portale &lt;a title=&quot;www.italia.it&quot; onclick=&quot;function anonymous()
{
blankUrl(this.href); return false;
}&quot; href=&quot;http://www.italia.it/&quot;&gt;italia.it&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Complimenti, proprio un &lt;em&gt;ottimo&lt;/em&gt; lavoro! (ovviamente &#232; ironico)&lt;/p&gt;&lt;p&gt;In particolare:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;di un lento spaventoso: o tutta Italia &#232; collegata al portale o sta girando su server collegati via modem 56K &lt;/li&gt;&lt;li&gt;immediatezza nulla: due pagine di intro prima di accedere alla home (la prima solo per sentire un Pavarotti che inneggia al Belpaese, la seconda solo per selezionare la lingua, il tutto corredato da animazioni Flash pesanti, brutte ed inutili) &lt;/li&gt;&lt;li&gt;url agghiaccianti: &lt;em&gt;http:// www.italia.it / wps / portal / ut / p / kcxml / 04_Sj9SPykssy0xPLMnMz0vM0Y_QjzKLN4j3Mg TJgFjGpvqRqCKOcIEgfW99X4 _83FT9AP2C3NCIckdHRQAuuTD4 / delta / base64xml / L3dJdyEvd0ZNQ UFzQ UMvNElV RS82XzBfSjI!? WCM_GLOBAL_CONTEXT= / wps / wcm / connect / Portale+del+Turismo / homepage / Visita+l%27Italia/&lt;/em&gt; (ho messo qualche spazio qua e l&#224; giusto per preservare il layout del blog) per accedere ad una pagina di secondo livello???? Prometto che non mi lementer&#242; mai pi&#249; dei link dei downlaod di Microsoft!!! &lt;/li&gt;&lt;li&gt;front-end HTML basato sulle tabelle (sveglia! siamo nel 2007!!!)... ma forse la colpa &#232; di IBM WebSphere (anche per le URL)... Gi&#224;: &#232; fatto in Java... LOL! In tutta onest&#224; per&#242; devo dire che non &#232; colpa della piattaforma ma di chi l'ha usata in modo cos&#236; approssimativo (i template di WebSphere sono ovviamente customizzabili, cos&#236; come le url delle pagine generate) &lt;/li&gt;&lt;li&gt;uso di finestre pop-up &lt;/li&gt;&lt;li&gt;la versione accessibile (non ho indagato se sia realmente accessibile) &#232; a parte... ma nemmeno il governo applica le leggi??! &lt;/li&gt;&lt;li&gt;i contenuti non li capisco (sono tardo io?): se clicco &amp;quot;Cosa Fare&amp;quot; visualizzo informazioni su... &amp;quot;il barocco in Italia&amp;quot;... e che c'azzecca? Bho! &lt;/li&gt;&lt;li&gt;complimenti per il logo: la &amp;quot;T&amp;quot; sembra... un fallo (non calcistico ma anatomico) e il mix di maiuscole e minuscole pensavo fosse una prerogativa dei dodicenni di oggi. &lt;em&gt;UPDATE:&lt;/em&gt; pare che &lt;strong&gt;solo il logo&lt;/strong&gt; sia costato qualcosa come &lt;strong&gt;100.000 Euro&lt;/strong&gt;. Centomila euro che, fatti quattro conti, equivalgono a un intero&#160;anno di lavoro&#160;di un grafico ben pagato (50 settimane&#160;x 5 giorni lavorativi x 8 ore a 50 Euro l'ora)... Mi sa che ho sbagliato mestiere!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Interrompo qui la lista per non infierire.&lt;/p&gt;&lt;p&gt;Beh, c'&#232; da dire che almeno - come gi&#224; anticipato da &lt;a onclick=&quot;function anonymous()
{
blankUrl(this.href); return false;
}&quot; href=&quot;http://blogs.aspitalia.com/nostromo/post1932/costare-portale.aspx&quot;&gt;Marco&lt;/a&gt; - &#232; costato poco &amp;quot;&lt;em&gt;solo&lt;/em&gt;&amp;quot; &lt;strong&gt;45.000.000 di Euro&lt;/strong&gt; (45 milioni dei &lt;strong&gt;nostri&lt;/strong&gt; euro!)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Laciamo perdere... &#232; meglio.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;PS: non ho usato nessun &amp;quot;IMHO&amp;quot; prima delle considerazioni perch&#233; mi sembrano oggettive e non soggettive; vi sfido a dire il contrario!&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post1973/Italia.it-Online.aspx"/><issued>2007-02-23T15:06:00+00:00</issued><modified>2007-02-23T15:06:00+00:00</modified><slash:comments>23</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post1973/Italia.it-Online.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1973.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1973</trackback:ping></entry><entry><title>IE6 e IE7 su una singola macchina</title><id>http://blogs.aspitalia.com/matteo/post1866/IE6-IE7-Singola-Macchina.aspx</id><created>2006-12-01T08:53:16+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1866' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Con l'uscita di IE7 si &#232; posto nuovamente il problema di testare i siti Web su differenti versioni di Internet Explorer. Esitono fondamentalmente due modi per avere pi&#249; versioni di IE sulla stessa macchina:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;utilizzando &lt;a href=&quot;http://browsers.evolt.org/?ie/32bit/standalone&quot;&gt;versioni &quot;stand-alone&quot; di IE&lt;/a&gt; e modificando qualche chiave di registro come spiegato in &quot;&lt;a title=&quot;internet explorer 7 running side by side with ie6. (standalone)&quot; href=&quot;http://tredosoft.com/ie7_standalone&quot;&gt;Internet Explorer 7 running side by side with IE6. (standalone)&lt;/a&gt;&quot; oppure utilizzando un setup che automatizzi l'operazione come ad esempio &lt;a title=&quot;multiple_ie&quot; href=&quot;http://tredosoft.com/multiple_ie&quot;&gt;Multiple_IE&lt;/a&gt; (che consente di avere sullo stesso PC praticamente tutte le versioni di IE, come segnalato da &lt;a title=&quot;internet explorer 7 ... 6 ... 5 ... 4 ....&quot; href=&quot;http://blogs.ugidotnet.org/programmingnotes/archive/2006/11/27/57412.aspx&quot;&gt;Andrea Moro&lt;/a&gt;)&lt;/li&gt; &lt;li&gt;utilizzando una virtual machine&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;La seconda strada &#232; quella &quot;ufficiale&quot; consigliata da Microsoft su &lt;a title=&quot;ie6 and ie7 running on a single machine&quot; href=&quot;http://blogs.msdn.com/ie/archive/2006/11/30/ie6-and-ie7-running-on-a-single-machine.aspx&quot;&gt;IEBlog&lt;/a&gt;: senza bisogno di licenze di Windows aggiuntive &#232; possibile scaricare &lt;a title=&quot;internet explorer 6 application compatibility vpc image&quot; href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=21eabb90-958f-4b64-b5f1-73d0a413c8ef&amp;amp;displaylang=en&quot;&gt;Internet Explorer 6 Application Compatibility VPC Image&lt;/a&gt; per avere la nostra virtual machine su &lt;a title=&quot;download virtual pc 2004&quot; href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=6d58729d-dfa8-40bf-afaf-20bcb7f01cd1&amp;amp;displaylang=en&quot;&gt;Virtual PC 2004&lt;/a&gt; (o Virtual PC 2007)&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post1866/IE6-IE7-Singola-Macchina.aspx"/><issued>2006-12-01T09:53:16+00:00</issued><modified>2006-12-01T09:53:16+00:00</modified><slash:comments>6</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post1866/IE6-IE7-Singola-Macchina.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1866.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1866</trackback:ping></entry><entry><title>Anonymous Methods e collection generiche</title><id>http://blogs.aspitalia.com/matteo/post1851/Anonymous-Methods-Collection-Generiche.aspx</id><created>2006-11-21T17:26:06+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1851' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Tutto quello che ci serve sapere per &lt;a title=&quot;managing collections with functors&quot; href=&quot;http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/20/367.aspx&quot;&gt;lavorare con le collection generiche usando anonymous methods&lt;/a&gt;; purtroppo &#232; in lingua inglese... ma se insistiamo tutti insieme magari &lt;a title=&quot;simoneb's blog&quot; href=&quot;http://dotnetslackers.com/community/blogs/simoneb/&quot;&gt;Simone&lt;/a&gt; lo traduce e lo posta anche sul &lt;a href=&quot;http://blogs.ugidotnet.org/simone%20busoli&quot;&gt;suo blog italiano&lt;/a&gt; o su &lt;a title=&quot;guru4.net&quot; href=&quot;http://www.guru4.net/&quot;&gt;GURU4.net&lt;/a&gt; ;-)&lt;/p&gt; &lt;p&gt;L'articolo &#232; un po' datato ma - per chi non l'avesse ancora visto - credo valga la pena spendere 10 minuti per risparmiare qualche ora al momento del bisogno :-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post1851/Anonymous-Methods-Collection-Generiche.aspx"/><issued>2006-11-21T18:26:06+00:00</issued><modified>2006-11-21T18:26:06+00:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post1851/Anonymous-Methods-Collection-Generiche.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1851.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1851</trackback:ping></entry><entry><title>Mobile 10.7 Beta Refresh</title><id>http://blogs.aspitalia.com/matteo/post1821/Mobile-10.7-Beta-Refresh.aspx</id><created>2006-11-07T13:07:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1821' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Oggi mi &#232; arrivato l'annuncio:&lt;/p&gt;&lt;p&gt;&amp;quot;&lt;em&gt;After months of waiting the new G2 bits are here for both Smartphone and Pocket PC devices!&lt;/em&gt;&amp;quot;&lt;/p&gt;&lt;p&gt;Su &lt;a title=&quot;microsoft connect&quot; href=&quot;https://connect.microsoft.com/&quot;&gt;Microsoft Connect&lt;/a&gt; &#232; disponibile il download della versione 10.7 Beta di &lt;strong&gt;Windows Live for Mobile&lt;/strong&gt; (code name &amp;quot;G2&amp;quot;) che include Messenger, Live Mail, Contatti, RSS news feeds e Local Search. Interessante anche la possibilit&#224; di aggiungere Live alla schermata &amp;quot;Today&amp;quot;.&lt;/p&gt;&lt;p&gt;Enjoy it!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Windows_Mobile/&quot; rel=&quot;tag&quot;&gt;Windows Mobile&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post1821/Mobile-10.7-Beta-Refresh.aspx"/><issued>2006-11-07T14:07:00+00:00</issued><modified>2006-11-07T14:07:00+00:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post1821/Mobile-10.7-Beta-Refresh.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1821.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1821</trackback:ping></entry><entry><title>Generare documenti Office via ASP.NET</title><id>http://blogs.aspitalia.com/matteo/post1811/Generare-Documenti-Office-ASP.NET.aspx</id><created>2006-10-31T11:37:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1811' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Quasi tutti noi abbiamo (almeno una volta, confessate!) avuto la necessit&#224; di creare nelle nostre applicazioni web funzionalit&#224; di esportazione dei dati in formato Exel o di generazione di documenti Word, trovandoci inevitabilmente a fare i conti con le difficolt&#224; del caso (Office sul server? E chi ce l'ha???) &lt;/p&gt;&lt;p&gt;Il vecchio formato binario in uso da 10 anni in Office era infatti decisamente troppo complesso per essere manipolato fuori dalla suite di Microsoft (ok, le versioni 2000 e 2003 hanno introdotto la possibilit&#224; di creare documenti in formato XML ma &#232; un po' un &amp;quot;optional&amp;quot; e con diverse limitazioni)&lt;/p&gt;&lt;p&gt;Per&#242;...&lt;/p&gt;&lt;p&gt;Se tra gli importanti e sostanziosi cambiamenti introdotti con &lt;strong&gt;Office 2007&lt;/strong&gt; quello pi&#249; evidente &#232; la nuova interfaccia grafica, quello pi&#249; interessante &#232; il cambiamento del &lt;strong&gt;formato dei documenti&lt;/strong&gt;: ora finalmente possiamo dire addio alle difficolt&#224; di manipolazione dei documenti Office da codice e Ted Pattison, su MSDN Magazine di Novembre 2006 ci illustra quanto diventa semplice lavorare con Office usando .NET: &lt;a title=&quot;server-side generation of word 2007 docs&quot; href=&quot;http://msdn.microsoft.com/msdnmag/issues/06/11/basicinstincts/default.aspx&quot;&gt;Server-Side Generation of Word 2007 Docs&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Happy (office documents) programming!&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post1811/Generare-Documenti-Office-ASP.NET.aspx"/><issued>2006-10-31T12:37:00+00:00</issued><modified>2006-10-31T12:37:00+00:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post1811/Generare-Documenti-Office-ASP.NET.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1811.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1811</trackback:ping></entry><entry><title>JavaScript SOAP Client Library su CodePlex</title><id>http://blogs.aspitalia.com/matteo/post1803/JavaScript-SOAP-Client-Library-CodePlex.aspx</id><created>2006-10-27T13:51:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1803' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Era gi&#224; da un po' che pensavo di farlo, poi un utente su &lt;a title=&quot;javascript soap client on codeproject&quot; onclick=&quot;function anonymous()
{
blankUrl(this.href); return false;
}&quot; href=&quot;http://www.codeproject.com/ajax/javascriptsoapclient.asp&quot;&gt;CodeProject&lt;/a&gt; me l'ha chiesto esplicitamente (cito: &amp;quot;&lt;em&gt;Isn't time for a source repository somewhere?&lt;/em&gt;&amp;quot;) &lt;/p&gt;&lt;p&gt;In effetti, tra il forum di CodeProject e i feedback diretti da &lt;a title=&quot;javascript soap client&quot; onclick=&quot;function anonymous()
{
blankUrl(this.href); return false;
}&quot; href=&quot;http://www.guru4.net/articoli/javascript-soap-client/en&quot;&gt;GURU4.net&lt;/a&gt; mi ritrovo con una tasklist di almeno 20 attivit&#224; di sviluppo, fix o integrazione che mi sa che non riuscir&#242; mai ad evadere! Non solo: alcuni dei ragazzi che mi hanno proposto dei fix sono *molto* pi&#249; in gamba di me e non vorrei rischiare di rovinare il loro lavoro ;-)&lt;/p&gt;&lt;p&gt;Ho cos&#236; provato a richiedere l'ammissione del progetto su &lt;a title=&quot;codeplex&quot; href=&quot;http://www.codeplex.com/&quot;&gt;CodePlex&lt;/a&gt; (sebbene non sia strettamente connesso a .NET) perch&#233; lo preferisco decisamente ad altri repository come &lt;a title=&quot;google code - project hosting&quot; onclick=&quot;function anonymous()
{
blankUrl(this.href); return false;
}&quot; href=&quot;http://code.google.com/hosting/&quot;&gt;Google Code&lt;/a&gt; o &lt;a title=&quot;sourceforge.net&quot; onclick=&quot;function anonymous()
{
blankUrl(this.href); return false;
}&quot; href=&quot;http://sourceforge.net/&quot;&gt;SourceForge&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;L'email automatica di risposta mi ha un po' demoralizzato: &amp;quot;&lt;em&gt;Given the large number of incoming requests that we receive, we cannot guarantee that your project will be created until we have added additional servers to our site.&amp;quot;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Invece, dopo sole 8 ore, mi arriva un'altra mail per avvisarmi che &amp;quot;&lt;em&gt;Your project has been created&lt;/em&gt;&amp;quot;! &lt;/p&gt;&lt;p&gt;Che dire? Spettacoloooo!!!!!!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;CodePlex &#232; veramente fantastico&lt;/strong&gt;: &#232; gratuito, ti mette a disposizione un sacco di strumenti (forum, feeds RSS, wiki, gestione del team, ecc.) oltre al vero plus: il controllo del versioning del codice sorgente ed il tracking dei work item basati su Team Foundation Server! &lt;br /&gt;Come se non bastasse... &#232; tutto semplicissimo da usare e configurare! &lt;/p&gt;&lt;p&gt;Ho avuto solo 5 minuti di panico quando in Visual Studio non potevo aggiungere il progetto al repository del codice sorgente... Ma sono stato demente io a dimenticarmi di cambiare il plug-in del source control da Visual SourceSafe a TFS :-)))&lt;/p&gt;&lt;p&gt;Dimenticavo: per chi fosse interessato l'url della home page del JavaScript SOAP Client su CodePlex &#232;: &lt;a title=&quot;http://www.codeplex.com/project/license.aspx?projectname=javascriptsoapclient&quot; href=&quot;http://www.codeplex.com/Wiki/View.aspx?ProjectName=JavaScriptSoapClient&quot;&gt;http://www.codeplex.com/Wiki/View.aspx?ProjectName=JavaScriptSoapClient&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;p&gt;PS: se usate la libreria e avete qualche idea per migliorarla si accettano developers!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/AJAX/&quot; rel=&quot;tag&quot;&gt;AJAX&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Javascript/&quot; rel=&quot;tag&quot;&gt;Javascript&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Visual_Studio/&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Web_Service/&quot; rel=&quot;tag&quot;&gt;Web Service&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post1803/JavaScript-SOAP-Client-Library-CodePlex.aspx"/><issued>2006-10-27T15:51:00+00:00</issued><modified>2006-10-27T15:51:00+00:00</modified><slash:comments>7</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post1803/JavaScript-SOAP-Client-Library-CodePlex.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1803.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1803</trackback:ping></entry><entry><title>Internet Explorer 7 - disponibile la RC1</title><id>http://blogs.aspitalia.com/matteo/post1717/Internet-Explorer-Disponibile-RC1.aspx</id><created>2006-08-25T08:07:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1717' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;IE7 &#232; finalmente giunto alla prima RC (Release Candidate), come annunciato sul &lt;a title=&quot;IEBlog&quot; href=&quot;http://blogs.msdn.com/ie/default.aspx&quot; target=&quot;_blank&quot;&gt;blog del team&lt;/a&gt;: &lt;a title=&quot;IE7 RC1&quot; href=&quot;http://blogs.msdn.com/ie/archive/2006/08/24/715752.aspx&quot; target=&quot;_blank&quot;&gt;Internet Explorer 7 Release Candidate Now Available&lt;/a&gt;. Nel post originale sono spiegate le variazioni.&lt;/p&gt;&lt;p&gt;La prima cosa che salta all'occhio sono le &lt;a title=&quot;Installation Changes in IE7 Release Candidate&quot; href=&quot;http://blogs.msdn.com/ie/archive/2006/08/24/714977.aspx&quot; target=&quot;_blank&quot;&gt;Installation Changes in IE7 Release Candidate&lt;/a&gt;&#160;per cui non sar&#224; pi&#249; necessario rimuovere manualmente eventuali versioni precedenti (beh, ad ogni modo un paio di reboot non ve li toglie nessuno!)&lt;/p&gt;&lt;p&gt;Unico problema da me riscontrato: al termine dell'installazione non era pi&#249; visibile la &amp;quot;Quick Start Toolbar&amp;quot; nella barra di Windows; niente di grave insomma :-)&lt;/p&gt;&lt;p&gt;Dimenticavo il link diretto per il download (gratuito, previa autenticazione della copia di Windows) di &lt;a title=&quot;Download IE7 RC1&quot; href=&quot;http://www.microsoft.com/ie/&quot; target=&quot;_blank&quot;&gt;IE7 RC1&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/matteo/post1717/Internet-Explorer-Disponibile-RC1.aspx"/><issued>2006-08-25T10:07:00+00:00</issued><modified>2006-08-25T10:07:00+00:00</modified><slash:comments>3</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post1717/Internet-Explorer-Disponibile-RC1.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1717.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1717</trackback:ping></entry></feed>