<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>DDL</title>
        <link>http://blogs.ugidotnet.org/ddl/Default.aspx</link>
        <description>Domain-Driven Life</description>
        <language>it-IT</language>
        <copyright>Nazareno</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <image>
            <title>DDL</title>
            <url>http://blogs.ugidotnet.org/images/RSS2Image.gif</url>
            <link>http://blogs.ugidotnet.org/ddl/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Migrare progetti ad un altro Framework</title>
            <category>.NET</category>
            <category>Visual Studio</category>
            <link>http://blogs.ugidotnet.org/ddl/archive/2017/11/09/Migrare-progetti-ad-un-altro-Framework.aspx</link>
            <description>&lt;p&gt;A meno che non siate della vecchia scuola e tutto va in un unico progetto della solution, ormai anche &lt;em&gt;banali&lt;/em&gt; solution possono avere una decina di progetti. &lt;/p&gt;  &lt;p&gt;In questo caso, la migrazione ad un’altra versione del Framework, per necessità o su richiesta del cliente, può essere, oltre che noioso (oltre a dover entrare in ogni progetto per cambiare il FW dobbiamo pure confermare la nostra scelta) anche prono a qualche errore in caso ci dimentichiamo di “passare” su qualche progetto. &lt;/p&gt;  &lt;p&gt;Ovviamente non siamo i soli ad avere questo problema e qualcuno ha già scritto l’extension per noi: &lt;a href="https://marketplace.visualstudio.com/items?itemName=PavelSamokha.TargetFrameworkMigrator"&gt;Target Framework Migrator&lt;/a&gt; fa proprio quello che ci serve e se volete partecipare allo sviluppo &lt;a href="https://github.com/VHQLabs/TargetFrameworkMigrator"&gt;il codice sorgente è su GitHub&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Happy Migrations! &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="style" alt="Winking smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Open-Live-Writer/Migrare-progetti-ad-un-altro-Framework_7F1D/wlEmoticon-winkingsmile_2.png" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="https://pavelsamokha.gallerycdn.vsassets.io/extensions/pavelsamokha/targetframeworkmigrator/1.6.5/1497372606679/92947/1/27-01-2013%2019-03-27.png" /&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/ddl/aggbug/102531.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Nazareno</dc:creator>
            <guid>http://blogs.ugidotnet.org/ddl/archive/2017/11/09/Migrare-progetti-ad-un-altro-Framework.aspx</guid>
            <pubDate>Thu, 09 Nov 2017 10:09:20 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ddl/archive/2017/11/09/Migrare-progetti-ad-un-altro-Framework.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ddl/comments/commentRss/102531.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ddl/services/trackbacks/102531.aspx</trackback:ping>
        </item>
        <item>
            <title>Sql Server e COLLATE</title>
            <category>Sql Server</category>
            <link>http://blogs.ugidotnet.org/ddl/archive/2015/09/29/sql-server-e-collate.aspx</link>
            <description>&lt;p&gt;In questi giorni mi sono trovato dover fare query tra database differenti e mi si è presentato il seguente errore:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Cannot resolve the collation conflict between "Latin1_General_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Il collate è la clausola che è possibile applicare a una definizione di database o di colonna per definire le regole di confronto oppure a un'espressione stringa di caratteri per applicare il casting delle regole di confronto.&lt;/p&gt;  &lt;p&gt;Ovviamente se DB differenti hanno collate differenti non può confrontare i campi (ma ci sono gli stessi problemi con un select/insert tra database)&lt;/p&gt;  &lt;p&gt;Una soluzione è forzare un collate nella query:&lt;/p&gt;    &lt;div id="codeSnippetWrapper"&gt;   &lt;pre id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 12pt; padding-right: 0px; background-color: #f4f4f4"&gt;&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;search&lt;/span&gt;.* &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; categories &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;search&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; categories.cid = &lt;span style="color: #0000ff"&gt;search&lt;/span&gt;.cat_id &lt;span style="color: #0000ff"&gt;collate&lt;/span&gt; SQL_Latin1_General_CP1_CI_AS&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;
Ma ovviamente se il problema è in tutta l’applicazione questa modifica potrebbe essere eccessivamente invasiva &lt;img class="wlEmoticon wlEmoticon-confusedsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Confused smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Sql-Server-e-COLLATE_87B4/wlEmoticon-confusedsmile_2.png" /&gt;



&lt;p&gt;Cambiare il collate nelle opzioni del database non è la soluzione, poiché le colonne già create si tengono il loro collate…&lt;/p&gt;

&lt;p&gt;Ma &lt;a href="http://stackoverflow.com/questions/16730114/how-to-change-the-collate-to-all-the-columns-of-the-database" target="_blank"&gt;qui&lt;/a&gt; ho trovato la soluzione… una query da lanciare per avere gli script di migrazione belli pronti:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 12pt; padding-right: 0px; background-color: #f4f4f4"&gt;&lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; @&lt;span style="color: #0000ff"&gt;collate&lt;/span&gt; SYSNAME&lt;br /&gt;&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; @&lt;span style="color: #0000ff"&gt;collate&lt;/span&gt; = &lt;span style="color: #006080"&gt;'Cyrillic_General_CS_AS'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;      &lt;span style="color: #006080"&gt;'['&lt;/span&gt; + SCHEMA_NAME(o.[schema_id]) + &lt;span style="color: #006080"&gt;'].['&lt;/span&gt; + o.name + &lt;span style="color: #006080"&gt;'] -&amp;gt; '&lt;/span&gt; + c.name&lt;br /&gt;    , &lt;span style="color: #006080"&gt;'ALTER TABLE ['&lt;/span&gt; + SCHEMA_NAME(o.[schema_id]) + &lt;span style="color: #006080"&gt;'].['&lt;/span&gt; + o.name + &lt;span style="color: #006080"&gt;']&lt;br /&gt;        ALTER COLUMN ['&lt;/span&gt; + c.name + &lt;span style="color: #006080"&gt;'] '&lt;/span&gt; +&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;UPPER&lt;/span&gt;(t.name) + &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; t.name &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; (&lt;span style="color: #006080"&gt;'ntext'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'text'&lt;/span&gt;) &lt;br /&gt;            &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'('&lt;/span&gt; + &lt;br /&gt;                &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; t.name &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; (&lt;span style="color: #006080"&gt;'nchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; c.max_length != -1 &lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.max_length / 2 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARCHAR&lt;/span&gt;(10))&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; t.name &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; (&lt;span style="color: #006080"&gt;'nchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; c.max_length = -1 &lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'MAX'&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.max_length &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARCHAR&lt;/span&gt;(10)) &lt;br /&gt;                &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; + &lt;span style="color: #006080"&gt;')'&lt;/span&gt; &lt;br /&gt;            &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; &lt;span style="color: #006080"&gt;''&lt;/span&gt; &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; + &lt;span style="color: #006080"&gt;' COLLATE '&lt;/span&gt; + @&lt;span style="color: #0000ff"&gt;collate&lt;/span&gt; + &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.is_nullable = 1 &lt;br /&gt;            &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #006080"&gt;' NULL'&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; &lt;span style="color: #006080"&gt;' NOT NULL'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; sys.columns c &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt;(NOLOCK)&lt;br /&gt;&lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; sys.objects o &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt;(NOLOCK) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; c.[object_id] = o.[object_id]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; sys.types t &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt;(NOLOCK) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; c.system_type_id = t.system_type_id &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; c.user_type_id = t.user_type_id&lt;br /&gt;&lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt; t.name &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; (&lt;span style="color: #006080"&gt;'char'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'text'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'ntext'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nchar'&lt;/span&gt;)&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; c.collation_name != @&lt;span style="color: #0000ff"&gt;collate&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; o.[type] = &lt;span style="color: #006080"&gt;'U'&lt;/span&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;pre&gt;&lt;code&gt;&lt;font face="Lucida Sans Unicode"&gt;Happy Sql-ing &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Winking smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Sql-Server-e-COLLATE_87B4/wlEmoticon-winkingsmile_2.png" /&gt;&lt;/font&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&lt;font face="Lucida Sans Unicode" /&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ba12ea4e-d7dc-4439-9b2f-e79fe2b8b60d" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Sql+Server" rel="tag"&gt;Sql Server&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Collate" rel="tag"&gt;Collate&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/ddl/aggbug/102047.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Nazareno</dc:creator>
            <guid>http://blogs.ugidotnet.org/ddl/archive/2015/09/29/sql-server-e-collate.aspx</guid>
            <pubDate>Tue, 29 Sep 2015 10:49:48 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ddl/archive/2015/09/29/sql-server-e-collate.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ddl/comments/commentRss/102047.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ddl/services/trackbacks/102047.aspx</trackback:ping>
        </item>
        <item>
            <title>Radical =&amp;gt; WPF Drag&amp;amp;Drop to the max</title>
            <category>.NET</category>
            <category>Radical</category>
            <link>http://blogs.ugidotnet.org/ddl/archive/2015/05/26/radical-gt-wpf-dragampdrop-to-the-max.aspx</link>
            <description>&lt;p&gt;Per un programma che sto sviluppando in questi giorni mi sono trovato a dover gestire il drag&amp;amp;drop tra controlli WPF. &lt;/p&gt;  &lt;p&gt;Ho deciso di utilizzare il &lt;a href="https://github.com/RadicalFx/radical"&gt;Framework Radical&lt;/a&gt; di &lt;a href="http://milestone.topics.it/"&gt;Mauro Servienti&lt;/a&gt; per implementare il pattern MVVM nella mia applicazione desktop.&lt;/p&gt;  &lt;p&gt;Il programma è una sorta di designer che posiziona elementi (raffigurati da rettangoli) su una superficie piana. Gli elementi possono essere posizionati o attraverso il drag&amp;amp;drop, o attraverso un doppio click sull’elemento stesso. &lt;/p&gt;  &lt;p&gt;Nel codice sorgente che trovate allegato vi ho creato la stessa situazione, in una versione semplificata, utile a capire come Radical permette di gestire la cosa con poche righe di codice. &lt;/p&gt;  &lt;p&gt;Iniziamo installando l’estensione &lt;a href="https://visualstudiogallery.msdn.microsoft.com/22dd31eb-3cb7-4027-972c-a6c96671cddd"&gt;Radical Templates&lt;/a&gt; che aggiungerà i Radical Project Templates a Visual Studio. In questo modo sotto i templates per i progetti Windows Desktop troveremo una sottocartella con i template per Radical che creeranno per noi una nuova soluzione già funzionante che implementa questo framework. L'estensione per Visual Studio non è un requisito ma una semplice comodità per essere operativi in meno tempo.&lt;/p&gt;  &lt;p&gt;Il framework utilizza le &lt;a href="https://github.com/RadicalFx/radical/wiki/Conventions"&gt;convenzioni&lt;/a&gt; per facilitarci l’utilizzo del pattern MVVM, quasi senza accorgerci di utilizzarlo. &lt;/p&gt;  &lt;p&gt;Non è questo il post dove sviscerare tutte le feature, di cui vi è &lt;a href="https://github.com/RadicalFx/radical/wiki"&gt;ampia documentazione&lt;/a&gt;, di questo framework, ma guardando il sorgente noterete come risulta veramente facile ed espressivo, senza avere un mucchio di codice per la comunicazione tra View e ViewModel, che in soluzioni non banali genera solo molto “rumore”.&lt;/p&gt;  &lt;p&gt;Passiamo alla gestione del Drag&amp;amp;Drop: &lt;/p&gt;  &lt;p&gt;dopo aver aggiunto il riferimento ai behaviors:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 12pt; padding-right: 0px; background-color: #f4f4f4"&gt;xmlns:behaviors=&lt;span style="color: #006080"&gt;"http://schemas.topics.it/wpf/radical/windows/behaviors"&lt;/span&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;basterà aggiungere le Attached Properties “behaviors:DragDropManager.DataObject” e “behaviors:DragDropManager.DataObjectType” al controllo da cui partiamo con il drag, mentre dovremo aggiungere la gestione del DropCommand sul controllo che subirà il drop con questa semplice riga di codice:&lt;/p&gt;

&lt;div&gt;
  &lt;pre id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 12pt; padding-right: 0px; background-color: #f4f4f4"&gt;behaviors:DragDropManager.OnDropCommand=&lt;span style="color: #006080"&gt;"{markup:AutoCommandBinding Path=DropItem}"&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Grazie a Radical, “DropItem” è seplicemente una funzione void del ViewModel che si preoccupa di gestire il drop dell’elemento. &lt;/p&gt;

&lt;p&gt;Poiché volevo rendere evidente dove sarebbe stato depositato l’elemento, ho aggiunto la gestione di altri due eventi: &lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 12pt; padding-right: 0px; background-color: #f4f4f4"&gt;behaviors:DragDropManager.OnDragEnterCommand=&lt;span style="color: #006080"&gt;"{markup:AutoCommandBinding Path=DragEnter}"&lt;/span&gt;  &lt;br /&gt;behaviors:DragDropManager.OnDragLeaveCommand=&lt;span style="color: #006080"&gt;"{markup:AutoCommandBinding Path=DragLeave}"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Che permettono di gestire l’ingresso e uscita dal controllo, rendendo evidente, con un altro colore, dove sarà depositato l’elemento.&lt;/p&gt;

&lt;p&gt;Ah… mi sono dimenticato… per la gestione del doppio click basta un’altra riga di codice: &lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 12pt; padding-right: 0px; background-color: #f4f4f4"&gt;behavior:ListViewManager.ItemDoubleClickCommand=&lt;span style="color: #006080"&gt;"{markup:AutoCommandBinding Path=ListViewDoubleClick}"&lt;/span&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Insomma, se guardate il codice c’è più codice nello XAML dei controlli che per l’implementazione di MVVM con Radical, ma volevo farvi assaggiare le potenzialità di questo framework in un'applicazione per lo meno “non banale”.&lt;/p&gt;

&lt;p&gt;Il sorgente di esempio lo trovate al seguente indirizzo: &lt;a title="http://1drv.ms/1Ar8dD6" href="http://1drv.ms/1Ar8dD6"&gt;http://1drv.ms/1Ar8dD6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Spero di aver stuzzicato la vostra curiosità e, se vi ho incuriositi, volentieri posterò altro su Radical. &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Winking smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/WPF-DragDrop-al-massimo-con-Radical_B81D/wlEmoticon-winkingsmile_2.png" /&gt;&lt;/p&gt;

&lt;p&gt;P.S. un grazie speciale a Mauro per il supporto! &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/WPF-DragDrop-al-massimo-con-Radical_B81D/wlEmoticon-smile_2.png" /&gt;&lt;/p&gt;

&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5a8c27fe-eb59-42f8-8b0a-ba4c9502967f" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Radical" rel="tag"&gt;Radical&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Drag%26Drop" rel="tag"&gt;Drag&amp;amp;Drop&lt;/a&gt;&lt;/div&gt;

&lt;div id="codeSnippetWrapper" /&gt;&lt;img src="http://blogs.ugidotnet.org/ddl/aggbug/102003.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Nazareno</dc:creator>
            <guid>http://blogs.ugidotnet.org/ddl/archive/2015/05/26/radical-gt-wpf-dragampdrop-to-the-max.aspx</guid>
            <pubDate>Tue, 26 May 2015 14:10:47 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ddl/archive/2015/05/26/radical-gt-wpf-dragampdrop-to-the-max.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ddl/comments/commentRss/102003.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ddl/services/trackbacks/102003.aspx</trackback:ping>
        </item>
        <item>
            <title>L&amp;rsquo;importanza del contesto</title>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/ddl/archive/2014/10/03/lrsquoimportanza-del-contesto.aspx</link>
            <description>&lt;p&gt;Penso di non essere il solo ormai così abituato ad usare Entity Framework e LINQ da dimenticarmi i principi fondamentali tra su cui si basa Entity Framework finché non ci sbatto il muso…. Come oggi &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Limportanza-del-contesto_1456A/wlEmoticon-smile_2.png" /&gt;&lt;/p&gt;  &lt;p&gt;Sto sviluppando la classica applicazioni di scambio dati tra sistemi legacy che fa un uso (ovviamente) importate dell’accessoacesso ai dati. Per cui cosa c’è di più comodo che un bel “reverse engineering” del database legacy per poi poterci operare con LINQ?&lt;img class="wlEmoticon wlEmoticon-smilewithtongueout" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile with tongue out" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Limportanza-del-contesto_1456A/wlEmoticon-smilewithtongueout_2.png" /&gt;&lt;/p&gt;  &lt;p&gt;Tutto filava per il meglio con mia grande soddisfazione finché non si è presentato il caso di dover chiamare un applicativo esterno che era preposto a fare delle modifiche allo stesso database ma la cui logica era cablata nell’eseguibile e quindi “doveva essere usata così com’era”.&lt;/p&gt;  &lt;p&gt;Vi riporto la parte di codice “incriminata”. Il programma reale è (ovviamente) un po’ più complesso e la logica è distribuita su più funzioni (altrimenti il problema mi sarebbe saltato subito all’occhio) ma rende l’idea del “pitfall” in cui si può cadere usando Entity Framework (o un qualsiasi altro ORM) come usiamo (o usavamo) ADO.NET.&lt;/p&gt;  &lt;p&gt;N.d.R. “ShellandWait” è una funzione che si preoccupa di lanciare un programma con un parametro ed attenderne la chiusura e…. scusate la sintassi VB &lt;img class="wlEmoticon wlEmoticon-embarrassedsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Embarrassed smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Limportanza-del-contesto_1456A/wlEmoticon-embarrassedsmile_2.png" /&gt;&lt;/p&gt;  &lt;div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:169fadec-9dde-47ac-afa2-9782004fb8a8" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;&lt;pre style=" width: 608px; height: 343px;background-color:White;overflow: auto;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF;"&gt;Using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ctx &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; provider.GetDataContext()
    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt; ordini &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; From p &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;In&lt;/span&gt;&lt;span style="color: #000000;"&gt; ctx.PortafoglioOrdini
                 Where p.Ordine &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ordine
                 &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Select&lt;/span&gt;&lt;span style="color: #000000;"&gt; p

    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;If&lt;/span&gt;&lt;span style="color: #000000;"&gt; ordini &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;IsNot&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Then&lt;/span&gt;&lt;span style="color: #000000;"&gt;
        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;For&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Each&lt;/span&gt;&lt;span style="color: #000000;"&gt; ordine &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;In&lt;/span&gt;&lt;span style="color: #000000;"&gt; ordini                    
            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt; res &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ShellandWait(programmaEsterno, ordine.Riga)
        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color: #000000;"&gt;
    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;End&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;If&lt;/span&gt;&lt;span style="color: #000000;"&gt;

    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt; ordineModificato &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (From p &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;In&lt;/span&gt;&lt;span style="color: #000000;"&gt; ctx.PortafoglioOrdini
                            Where p.Ordine &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ordine
                            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Select&lt;/span&gt;&lt;span style="color: #000000;"&gt; p).FirstOrDefault()
    
    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Return&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ordineModificato &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;IsNot&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;AndAlso&lt;/span&gt;&lt;span style="color: #000000;"&gt; ordineModificato.Stato &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;X&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)
&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;End&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;Using&lt;/span&gt;&lt;span style="color: #000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Diciamo (sempre per semplificare) che tra le varie cose che fa il programma esterno una di quelle è cambiare una colonna della tabella PortafoglioOrdini e io uso questa modifica per verificare che il programma abbia girato correttamente. &lt;/p&gt;

&lt;p&gt;Ma il controllo mi tornava sempre false, benché la verifica sul database rendesse evidente che tutto funzionasse al meglio. &lt;img class="wlEmoticon wlEmoticon-surprisedsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Surprised smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Limportanza-del-contesto_1456A/wlEmoticon-surprisedsmile_2.png" /&gt;&lt;/p&gt;

&lt;p&gt;Quello che mi ero dimenticato è che il DbContext di Entity Framework implementa i pattern della &lt;a href="http://martinfowler.com/eaaCatalog/unitOfWork.html" target="_blank"&gt;Unit Of Work&lt;/a&gt; e &lt;a href="http://martinfowler.com/eaaCatalog/identityMap.html" target="_blank"&gt;Identity Map&lt;/a&gt; per cui una volta letti i dati non li rilegge più dal DB poiché, correttamente in quasi tutti i casi, ritiene di avere conoscenza dello stato letto e di tutte le modifiche apportate al dato che siano state persistite o meno.&lt;/p&gt;

&lt;p&gt;Capito il problema (e per una volta senza ricorrere a Stack Overflow &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Winking smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Limportanza-del-contesto_1456A/wlEmoticon-winkingsmile_2.png" /&gt; ) ho risolto facilmente il problema dividendo il singolo DbContext in due differenti, uno prima e uno dopo la chiamata al programma esterno. &lt;/p&gt;

&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8941645a-8ad8-49f4-b761-af3086589185" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Entity+Framework" rel="tag"&gt;Entity Framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DbContext" rel="tag"&gt;DbContext&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/ddl/aggbug/101887.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Nazareno</dc:creator>
            <guid>http://blogs.ugidotnet.org/ddl/archive/2014/10/03/lrsquoimportanza-del-contesto.aspx</guid>
            <pubDate>Fri, 03 Oct 2014 00:32:39 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ddl/archive/2014/10/03/lrsquoimportanza-del-contesto.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ddl/comments/commentRss/101887.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ddl/services/trackbacks/101887.aspx</trackback:ping>
        </item>
        <item>
            <title>Se il dev non va a CQRS...</title>
            <link>http://blogs.ugidotnet.org/ddl/archive/2014/02/28/se-il-dev-non-va-a-cqrs.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Premessa: mi rendo conto che questo potrà apparire come un “piccolo spazio pubblicità”, ma in realtà è solo dettato da quell’entusiasmo che mi guida e sprona in questo bellissimo lavoro che ci accomuna. Chiarito questo… &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Winking smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Se-il-dev-non-va-a-CQRS_CD7D/wlEmoticon-winkingsmile_2.png" /&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Poco più di un annetto fa mi sono imbattuto in &lt;a href="http://martinfowler.com/bliki/CQRS.html"&gt;Command Query Resposability Segregation (CQRS)&lt;/a&gt; e &lt;a href="http://martinfowler.com/eaaDev/EventSourcing.html"&gt;Event Sourcing (ES)&lt;/a&gt;. Non vi sto a dire che cosa sono perché se usate un qualsiasi motore di ricerca potete trovare migliaia di articoli in qualsiasi lingua che lo spiegano meglio di quanto potrei farlo io.&lt;/p&gt;  &lt;p&gt;Devo ammettere che al primo impatto ho capito veramente poco e mi sono detto: “sarà la solita moda del momento che passerà in fretta”, ma qualche spunto e qualche post letto poi a casa mi avevano lasciato una certa curiosità di approfondire l’argomento. Per cui ho girato un po’ di conferenze in giro per l’Italia e alla fine ho capito le potenzialità dei due strumenti. Ve la faccio breve: se come me avevate visto le potenzialità di DDD ma avevate problemi a capire come calarle nelle vostre soluzioni, questi due strumenti possono essere una valida soluzione.&lt;/p&gt;  &lt;p&gt;Non vi nascondo che essendo delle soluzioni architetturali “giovani” la loro implementazione non è proprio una passeggiata e per evitare di fare danni maggiori ai benefici e partire con il piede giusto  è necessario comprendere la filosofia che ci sta dietro. Ma le potenzialità sono enormi, specialmente se come capita a quasi a tutti (me compreso) una applicazione (o un insieme di applicazioni) continuano a crescere per anni rendendo complessa la loro gestione/manutenzione/crescita.&lt;/p&gt;  &lt;p&gt;Se tutto questo vi suona famigliare, CQRS può essere una soluzione e ora non avete più scuse perché CQRS viene da voi… a breve, infatti, partirà un tour che coprirà gran parte dell’Italia proprio su CQRS e su an altro argomento caldo del momento: AngularJs e le applicazioni SPA.&lt;/p&gt;  &lt;p&gt;Le tappe saranno Padova, Torino, Napoli e Bari, organizzate da &lt;a href="http://ynnovahq.com/it/"&gt;Ynnova&lt;/a&gt; in collaborazione con &lt;a href="http://blogs.ugidotnet.org/topics/Default.aspx"&gt;Mauro Servienti&lt;/a&gt; di &lt;a href="http://www.manageddesigns.it/"&gt;Managed Designs&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Per le informazioni dettagliate le trovate &lt;a href="http://ynnovahq.com/it/latest-news/cqrs-eventsourcing-e-angularjs-on-tour/"&gt;qui&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Ora non avete più scuse! ;)&lt;/p&gt;  &lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7ec83b5d-0f1a-49ad-a2e1-b7c33c3f8ecc" class="wlWriterSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/CQRS" rel="tag"&gt;CQRS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ES" rel="tag"&gt;ES&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/ddl/aggbug/101801.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Nazareno</dc:creator>
            <guid>http://blogs.ugidotnet.org/ddl/archive/2014/02/28/se-il-dev-non-va-a-cqrs.aspx</guid>
            <pubDate>Fri, 28 Feb 2014 15:44:37 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ddl/archive/2014/02/28/se-il-dev-non-va-a-cqrs.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ddl/comments/commentRss/101801.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ddl/services/trackbacks/101801.aspx</trackback:ping>
        </item>
        <item>
            <title>App Challenge XMAS 3 - WP8+W8</title>
            <category>Visual Studio</category>
            <category>Windows Phone</category>
            <category>Windows</category>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/ddl/archive/2013/11/30/app-challenge-xmas-3-wp8w8.aspx</link>
            <description>&lt;p&gt;Siete bravi sviluppatori Window Phone 8 e Windows 8? &lt;a href="http://www.dvlup.com/Challenge/308"&gt;Questa challenge di Nokia DVLUP&lt;/a&gt; fa decisamente per voi!&lt;/p&gt;  &lt;p&gt;Se sviluppate due nuove app per Windows Phone e due per Windows 8 guadagnate 800 XP che vi serviranno per i ricchi premi messi a disposizione da questo rewards program.&lt;/p&gt;  &lt;p&gt;Ma non è finita qui: se ci mettete vicino un’altra app per ciascuna piattaforma (passando quindi a tre app per piattaforma) avrete in regalo un &lt;a href="http://www.nokia.com/it-it/prodotti/telefoni-cellulari/lumia925"&gt;Lumia 925&lt;/a&gt;. &lt;img class="wlEmoticon wlEmoticon-surprisedsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Sorpresa" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/App-Challenge-XMAS-3---WP8W8_4AF/wlEmoticon-surprisedsmile_2.png" /&gt;&lt;/p&gt;  &lt;p&gt;Sicuramente non è facile, visto il poco tempo a vostra disposizione, ma in questo caso lo sforzo vale sicuramente la candela!&lt;/p&gt;  &lt;p&gt;E ricordatevi che avete a disposizione anche l’&lt;a href="http://apps.windowsstore.com/"&gt;App Studio&lt;/a&gt; per aiutarvi in quest’ardua impresa.&lt;/p&gt;  &lt;p&gt;Vi chiedo solo di impegnarvi a fare delle app di qualità e non solo orientate ad ottenere il premio… un po’ di #OrgoglioDev!!!! &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Occhiolino" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/App-Challenge-XMAS-3---WP8W8_4AF/wlEmoticon-winkingsmile_2.png" /&gt;&lt;/p&gt;  &lt;p&gt;In bocca al lupo!&lt;/p&gt;  &lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4f8f0015-3e63-489c-aba2-40695da0bf66" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/Nokia" rel="tag"&gt;Nokia&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DVLUP" rel="tag"&gt;DVLUP&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WP8" rel="tag"&gt;WP8&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Win8" rel="tag"&gt;Win8&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/ddl/aggbug/101732.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Nazareno</dc:creator>
            <guid>http://blogs.ugidotnet.org/ddl/archive/2013/11/30/app-challenge-xmas-3-wp8w8.aspx</guid>
            <pubDate>Sat, 30 Nov 2013 01:34:16 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ddl/archive/2013/11/30/app-challenge-xmas-3-wp8w8.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ddl/comments/commentRss/101732.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ddl/services/trackbacks/101732.aspx</trackback:ping>
        </item>
        <item>
            <title>Entity Framework e gli errori di validazione</title>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/ddl/archive/2013/10/24/entity-framework-e-gli-errori-di-validazione.aspx</link>
            <description>&lt;p&gt;Se usate Entity Framework e se, come me, allineate le piccole modifiche sul “dominio” con modifiche manuali sul DB (specialmente quando avete anni di dati dentro &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Winking smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Entity-Framework-e-gli-errori-di-validaz_D950/wlEmoticon-winkingsmile_2.png" /&gt;), vi può capitare di ottenere il seguente errore:&lt;/p&gt;  &lt;h3&gt;&lt;font color="#285090"&gt;Validation failed for one or more entities. See 'EntityValidationErrors' property for more details&lt;/font&gt;&lt;/h3&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;A volte scoprire dov’è il problema di validazione non è così facile e può venire utile metterci un try-catch di questo tipo: &lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt;
{
    ctx.SaveChanges();
}
&lt;span class="kwrd"&gt;catch&lt;/span&gt; (DbEntityValidationException e)
{
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var eve &lt;span class="kwrd"&gt;in&lt;/span&gt; e.EntityValidationErrors)
    {
        Debug.Print(&lt;span class="str"&gt;"Entity of type \"{0}\" in state \"{1}\" has the following validation errors:"&lt;/span&gt;,
            eve.Entry.Entity.GetType().Name, eve.Entry.State);
        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var ve &lt;span class="kwrd"&gt;in&lt;/span&gt; eve.ValidationErrors)
        {
            Debug.Print(&lt;span class="str"&gt;"- Property: \"{0}\", Error: \"{1}\""&lt;/span&gt;,
                ve.PropertyName, ve.ErrorMessage);
        }
    }
    &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Ovviamente grazie a Stackoverflow per la dritta &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Entity-Framework-e-gli-errori-di-validaz_D950/wlEmoticon-smile_2.png" /&gt;&lt;/p&gt;

&lt;p&gt;Certo, se usaste &lt;a href="http://blogs.ugidotnet.org/topics/archive/2013/07/02/managed-designs-implementing-cqrs.aspx"&gt;CQRS e I database documentali&lt;/a&gt; non avreste di questi problemi, ma questa è un’altra storia &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Winking smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Entity-Framework-e-gli-errori-di-validaz_D950/wlEmoticon-winkingsmile_2.png" /&gt;&lt;/p&gt;

&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b2b33904-1668-438a-8496-9a6f07010fc6" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Entity+Framework" rel="tag"&gt;Entity Framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Validation+Errors" rel="tag"&gt;Validation Errors&lt;/a&gt;&lt;/div&gt;


&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;img src="http://blogs.ugidotnet.org/ddl/aggbug/101705.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Nazareno</dc:creator>
            <guid>http://blogs.ugidotnet.org/ddl/archive/2013/10/24/entity-framework-e-gli-errori-di-validazione.aspx</guid>
            <pubDate>Thu, 24 Oct 2013 16:36:51 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ddl/archive/2013/10/24/entity-framework-e-gli-errori-di-validazione.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ddl/comments/commentRss/101705.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ddl/services/trackbacks/101705.aspx</trackback:ping>
        </item>
        <item>
            <title>Update e Inner Join in SQL</title>
            <link>http://blogs.ugidotnet.org/ddl/archive/2013/10/23/update-e-inner-join-in-sql.aspx</link>
            <description>&lt;p&gt;Si… lo so… ormai il mondo dello sviluppo si muove su altre strade (ORM, CQRS, DB documentali), ma a volte abbiamo a che fare con il buon vecchio SQL.&lt;/p&gt;  &lt;p&gt;Ogni volta che aggiungo una anagrafica dove prima c’era il “codice secco” non mi ricordo come aggironare in una sola volta tutti gli id della tabella… &lt;/p&gt;  &lt;p&gt;…beh ecco un memo se siete come me &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Winking smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Update-e-Inner-Join-in-SQL_E366/wlEmoticon-winkingsmile_2.png" /&gt;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;UPDATE&lt;/span&gt; b 
&lt;span class="kwrd"&gt;SET&lt;/span&gt;    b.article_id = a.id 
&lt;span class="kwrd"&gt;FROM&lt;/span&gt;   billofmaterials b 
       &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt; articles a 
               &lt;span class="kwrd"&gt;ON&lt;/span&gt; b.articlecode = a.code 
&lt;span class="kwrd"&gt;WHERE&lt;/span&gt;  b.article_id &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;/pre&gt;

&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:02283755-f59f-4610-a249-b636fae344ba" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SQL" rel="tag"&gt;SQL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Update" rel="tag"&gt;Update&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Inner+Join" rel="tag"&gt;Inner Join&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/ddl/aggbug/101704.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Nazareno</dc:creator>
            <guid>http://blogs.ugidotnet.org/ddl/archive/2013/10/23/update-e-inner-join-in-sql.aspx</guid>
            <pubDate>Wed, 23 Oct 2013 17:14:18 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ddl/archive/2013/10/23/update-e-inner-join-in-sql.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ddl/comments/commentRss/101704.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ddl/services/trackbacks/101704.aspx</trackback:ping>
        </item>
        <item>
            <title>I &amp;lt;3 LINQ</title>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/ddl/archive/2013/10/09/i-lt3-linq.aspx</link>
            <description>&lt;p&gt;Ho ripreso in mano un progetto scritto sei anni fa. Devo dire che LINQ e gli Extension Methods sono dei gran strumenti.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;internal&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; GetDictionaryCountries()
        {
            var retDict = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;();
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (ISession session = SessionHelper.GetSession())
            {
                IList&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt; objList = session.CreateQuery(&lt;span class="str"&gt;"select i.Code, i.Id from Country i"&lt;/span&gt;).List&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;();
                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;object&lt;/span&gt; obj &lt;span class="kwrd"&gt;in&lt;/span&gt; objList)
                {
                    Array arr = (Array)obj;
                    retDict.Add(Convert.ToString(arr.GetValue(0)), Convert.ToInt32(arr.GetValue(1)));
                }
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; retDict;
        }&lt;/pre&gt;

&lt;p /&gt;&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;Diventa:

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;internal&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; GetDictionaryCountries()
        {
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (ISession session = SessionHelper.GetSession())
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; session.Query&amp;lt;Country&amp;gt;().Select(x =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; { x.Code, x.Id }).ToDictionary(x =&amp;gt; x.Code, x =&amp;gt; x.Id);
            }
        }&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;Devo aggiungere altro? &lt;img class="wlEmoticon wlEmoticon-openmouthedsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Open-mouthed smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/I-3-LINQ_D492/wlEmoticon-openmouthedsmile_2.png" /&gt; 

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;P.S. la versione 1 era pure in VB.NET ma l’ho tradotta per un confronto più facile &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Winking smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/I-3-LINQ_D492/wlEmoticon-winkingsmile_2.png" /&gt;&lt;/p&gt;

&lt;p&gt;P.P.S. Non sparate sul pianista sul perchè faccio una cosa del genere o quanto fa schifo tornare un dictionary, è stato il primo programma scritto in .NET &lt;img class="wlEmoticon wlEmoticon-embarrassedsmile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Embarrassed smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/I-3-LINQ_D492/wlEmoticon-embarrassedsmile_2.png" /&gt;&lt;/p&gt;

&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:97e2cc26-c464-4dcc-97b2-e69b00bac8b0" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/LINQ" rel="tag"&gt;LINQ&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Extension+Methods" rel="tag"&gt;Extension Methods&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/ddl/aggbug/101689.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Nazareno</dc:creator>
            <guid>http://blogs.ugidotnet.org/ddl/archive/2013/10/09/i-lt3-linq.aspx</guid>
            <pubDate>Wed, 09 Oct 2013 16:18:49 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ddl/archive/2013/10/09/i-lt3-linq.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ddl/comments/commentRss/101689.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ddl/services/trackbacks/101689.aspx</trackback:ping>
        </item>
        <item>
            <title>Radical &amp;ndash; A new day has come &amp;lt;cit.&amp;gt;</title>
            <link>http://blogs.ugidotnet.org/ddl/archive/2013/07/03/radical-ndash-a-new-day-has-come-ltcit.gt.aspx</link>
            <description>&lt;p&gt;Questo è il primo di alcuni articoli che tratteranno l’utilizzo del framework &lt;a href="http://radical.codeplex.com/" target="_blank"&gt;Radical&lt;/a&gt;, sviluppato da &lt;a href="http://blogs.ugidotnet.org/topics/Default.aspx" target="_blank"&gt;Mauro Servienti&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Qualche premessa: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;molto di quello che trovate qui lo potete trovare anche sulla &lt;a href="http://radical.codeplex.com/documentation" target="_blank"&gt;documentazione di Radical&lt;/a&gt; che Mauro sta scrivendo, in inglese, impegni lavorativi permettendo; &lt;/li&gt;    &lt;li&gt;lo scopo di questi post è presentarvi alcune facilities che questo framework mette a disposizione, in italiano! &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Occhiolino" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Radical--Un_E46A/wlEmoticon-winkingsmile_2.png" /&gt;; &lt;/li&gt;    &lt;li&gt;io ho sempre trovato poco intuitivo l’utilizzo del toolkit &lt;a href="http://mvvmlight.codeplex.com/" target="_blank"&gt;MVVM Light Toolkit&lt;/a&gt;; &lt;/li&gt;    &lt;li&gt;non mi piace molto l’utilizzo che fa &lt;a href="http://caliburnmicro.codeplex.com/" target="_blank"&gt;Caliburn.Micro&lt;/a&gt; della proprietà Name dei controlli per il binding (mi hanno sempre detto: &lt;strong&gt;“in MVVM usare Name è MALE!”&lt;/strong&gt; &lt;img class="wlEmoticon wlEmoticon-openmouthedsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="A bocca aperta" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Radical--Un_E46A/wlEmoticon-openmouthedsmile_2.png" /&gt;), ma ammetto che è questione di gusti; &lt;/li&gt;    &lt;li&gt;trovavo noioso e “error-prone” dover scrivere centinaia di righe di codice solo per gestire in maniera “&lt;u&gt;decente&lt;/u&gt;” l’iterazione con l’utente. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Da queste poche righe, capite che fino a poco tempo fa il mio rapporto con MVVM e il databinding era molto problematico e  alla fine ricadevo sempre sulle care e vecchie Windows Forms che almeno mi consentivano un miglior controllo sull’iterazione con la UI.&lt;/p&gt;  &lt;p&gt;In tutti i progetti di esempio, infatti, vengono dimostrati i vantaggi del data binding facendo vedere come, con due righe di codice, puoi recuperare i dati e visualizzarli, ma non fanno vedere che, una volta applicato il pattern MVVM, ci si scontra con molti altri problemi che non avevamo con le &lt;em&gt;vecchie&lt;/em&gt; WinForms, ad esempio: la gestione delle finestre di dialogo dal ViewModel, il passaggio di parametri tra View (o ViewModel), fino ad arrivare al problema di dover gestire il data binding con controlli che non lo prevedono (PasswordBox) &lt;img class="wlEmoticon wlEmoticon-confusedsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Perplesso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Radical--Un_E46A/wlEmoticon-confusedsmile_2.png" /&gt;&lt;/p&gt;  &lt;p&gt;Radical ha una risposta a tutti questi problemi ed a molti altri e vi semplificherà la vita e diminuendo del 50% il codice che state scrivendo se usate MVVM Light Toolkit (esperienza diretta su un mio progetto).&lt;/p&gt;  &lt;p&gt;Partiamo da una guida in 8 passi per creare un progetto funzionate (in C#):&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create una nuova applicazione WPF; &lt;/li&gt;    &lt;li&gt;Aggiungete, attraverso &lt;a href="http://nuget.org/packages?q=Radical" target="_blank"&gt;Nuget&lt;/a&gt;, un riferimento a  &lt;a href="https://www.nuget.org/packages/Radical.Windows.Presentation.CastleWindsor/" target="_blank"&gt;Radical.Windows.Presentation.CastleWindsor&lt;/a&gt; (ma se preferite o il vostro progetto usa già un altro IoC container sono supportati anche &lt;a href="https://www.nuget.org/packages/Radical.Windows.Presentation.Unity2/0.0.2.0-Alfa" target="_blank"&gt;Unity2&lt;/a&gt;, &lt;a href="https://www.nuget.org/packages/Radical.Windows.Presentation.Unity3/0.0.1.0-Alfa" target="_blank"&gt;Unity3&lt;/a&gt;, &lt;a href="https://www.nuget.org/packages/Radical.Windows.Presentation.Autofac/0.0.1.0-Alfa" target="_blank"&gt;Autofac&lt;/a&gt; e &lt;a href="https://www.nuget.org/packages/Radical.Windows.Presentation.Puzzle/" target="_blank"&gt;Puzzle&lt;/a&gt; per le app RT). Nota: se non trovate il riferimento giusto dovete solo selezionare “Include Prelerase” nella ricerca dei pacchetti Nuget; &lt;/li&gt;    &lt;li&gt;Cancellate la Window creata di default da Visual Studio (&lt;em&gt;MainWindow.xaml);&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Modificate il file "&lt;em&gt;app.xaml&lt;/em&gt;" rimuovendo l'attributo "&lt;em&gt;StartupUri&lt;/em&gt;" &lt;/li&gt;    &lt;li&gt;Aggiungete un folder “&lt;em&gt;Presentation&lt;/em&gt;” al progetto (è il folder dove Radical cerca di default le View e i ViewModel); &lt;/li&gt;    &lt;li&gt;Create una nuova window chiamandola “&lt;em&gt;MainView.xaml&lt;/em&gt;” (di default Radical considera Views le windows il cui nome finisce per “View”); &lt;/li&gt;    &lt;li&gt;Create una nuova classe chiamandola “&lt;em&gt;MainViewModel.cs&lt;/em&gt;” (di default Radical considera ViewModels le classi il cui nome finisce per “ViewModel” e le lega alla View che ha la stessa radice); &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Andate nel file “&lt;em&gt;app.xaml.cs&lt;/em&gt;” e aggiungete una singola riga di codice (ovviamente cambiando la dichiarazione del bootstrapper a seconda dell’IoC container scelto): &lt;/p&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; App : Application
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; App()
        {
            var bootstrapper = &lt;span class="kwrd"&gt;new&lt;/span&gt; WindsorApplicationBootstrapper&amp;lt;MainView&amp;gt;();
        }
    }&lt;/pre&gt;

&lt;p align="left"&gt;Premete F5 e tutto funzionerà, ossia si apre una Window vuota! &lt;img class="wlEmoticon wlEmoticon-openmouthedsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="A bocca aperta" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Radical--Un_E46A/wlEmoticon-openmouthedsmile_2.png" /&gt;&lt;/p&gt;

&lt;p align="left"&gt;Come avrete capito anche Radical si basa sul paradigma &lt;a href="http://it.wikipedia.org/wiki/Convention_Over_Configuration" target="_blank"&gt;Convention Over Configuration&lt;/a&gt; e dietro le quinte ha:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Legato la View e il ViewModel senza dover aggiungere alcunché; &lt;/li&gt;

  &lt;li&gt;Fatto partire la View da noi scelta (in questo caso la “MainView”); &lt;/li&gt;

  &lt;li&gt;Reso la MainView singleton (per convenzione se la View inizia per “Main” o “Shell” allora è singleton); &lt;/li&gt;

  &lt;li&gt;Abilitato molte altre cose che in progetto vuoto come questo non è possibile farvi vedere &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Occhiolino" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Radical--Un_E46A/wlEmoticon-winkingsmile_2.png" /&gt; &lt;!--EndFragment--&gt;&lt;/li&gt;

  &lt;li&gt;
    &lt;div align="left"&gt;Ovviamente tutte queste convenzioni possono essere “overridate” all’occorrenza &lt;img class="wlEmoticon wlEmoticon-hotsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Caldo" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/ddl/Windows-Live-Writer/Radical--Un_E46A/wlEmoticon-hotsmile_2.png" /&gt;&lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p align="left"&gt;Ora abbiamo una Window vuota che dalla prossima volta vedremo di riempire con qualche controllo e un po’ di logica in modo da esplorare le altre potenzialità di questo framework.&lt;/p&gt;

&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:15fe381e-ffea-443a-b22a-9d022b2f42b4" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/Radical" rel="tag"&gt;Radical&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MVVM" rel="tag"&gt;MVVM&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/ddl/aggbug/101606.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Nazareno</dc:creator>
            <guid>http://blogs.ugidotnet.org/ddl/archive/2013/07/03/radical-ndash-a-new-day-has-come-ltcit.gt.aspx</guid>
            <pubDate>Wed, 03 Jul 2013 23:12:06 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ddl/archive/2013/07/03/radical-ndash-a-new-day-has-come-ltcit.gt.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ddl/comments/commentRss/101606.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ddl/services/trackbacks/101606.aspx</trackback:ping>
        </item>
    </channel>
</rss>