.Net 3.0 http://blogs.ugidotnet.org/Crad/category/.Net 3.0.aspx .Net 3.0 it-IT Marco De Sanctis Subtext Version 2.6.0.0 Costanti pubbliche? AHIAHIAHI http://blogs.ugidotnet.org/Crad/archive/2008/01/31/costanti-pubbliche-ahiahiahi.aspx <p>Premessa: ciò che scriverò è una banalità, ma secondo me in tanti non ne sono al corrente o non ci pensano. Di cosa parlo? Di cose del genere:</p> <p> </p><div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:23264bd7-da92-41a5-ba6e-3c35ed74d666" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> MyConst </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">10</span><span style="color: #000000;">;</span></div></pre></div> <p>Il danno potenziale che le <strong>costanti pubbliche </strong>possono creare alla stabilità delle nostre applicazioni è enorme.</p> <p>Why? Perché le costanti non sono altro che <strong>placeholder</strong> risolti <strong>in fase di compilazione</strong>. Questo vuol dire che, finché non si ricompila, il valore non viene aggiornato.</p> <p>Implicazioni?</p> <ol> <li>Assembly A che definisce una costante MyConst = 10</li> <li>Assembly B che referenzia Assembly A e ne utilizza MyConst</li> <li>Assembly A cambia MyConst a 15</li> <li><strong>Finché non ricompilo Assembly B</strong>, questo continua a vedere MyConst = 10</li></ol> <p>Ogni tanto mi capita di trovare righe di codice simili a quella in alto, con seguenti bug "strani" e dolori per scovarli. Ecco perché cerco sempre di abituare i junior che lavorano con me alla regola:</p> <blockquote> <p><em><strong>Le costanti devono essere sempre private o internal. Se serve esporle allora si utilizzino dei field readonly</strong>.</em></p></blockquote> <p>Augh!</p> <p> </p><div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:e23a99d5-f626-4d0a-a547-d6a97a6dad5b" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/Costanti" rel="tag">Costanti</a>, <a href="http://technorati.com/tags/Readonly%20field" rel="tag">Readonly field</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/90956.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2008/01/31/costanti-pubbliche-ahiahiahi.aspx Thu, 31 Jan 2008 16:15:13 GMT http://blogs.ugidotnet.org/Crad/archive/2008/01/31/costanti-pubbliche-ahiahiahi.aspx#feedback 6 http://blogs.ugidotnet.org/Crad/comments/commentRss/90956.aspx WCF, DTO, Fatture e RapportinoMaker (TM) http://blogs.ugidotnet.org/Crad/archive/2007/10/30/wcf-dto-fatture-e-rapportinomaker-tm.aspx <p>Volevo lasciare un commento <a href="http://blog.vivendobyte.net/archive/2007/10/29/326.aspx">al post di Igor</a>, poi ne è venuto fuori un papiro e allora è meglio scrivere qui.</p> <p>A mio modo di vedere, c'è un errore di fondo nel concetto di DTO espresso in quel post. Un DTO, infatti, <strong>*NON*</strong> deve né ereditare, né incapsulare l'oggetto che rappresenta; anzi... dirò di più: un DTO non deve avere alcuna relazione con l'entità (o le entità) di dominio che rappresenta, altrimenti non sarebbe un DTO!!</p> <p>Cerco di spiegare meglio il concetto. Perché creo ed espongo un DTO? Una delle ragioni può essere che non voglio/posso esporre direttamente una mia entity di dominio. E allora che senso ha creare un DTO che la incapsula? o da cui eredita? Finirei comunque per esporla, no?</p> <p>In realtà, il DTO <a href="http://martinfowler.com/eaaCatalog/dataTransferObject.html">ha un significato più ampio</a>: è semplicemente un modo per codificare un particolare messaggio <strong>rappresentandolo</strong> in forma di oggetto, e non necessariamente è mappato 1-1 con le entità di un domain model (diciamo pure che in generale, ha decisamente poco a che vedere con esse).</p> <p>Nel caso di Igor, volendo creare un DTO per l'oggetto Fattura, probabilmente realizzerei qualcosa del genere:</p> <p> </p><div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:2009d44d-d780-444f-a9a4-5da7549b5d3d" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;background-color:#EEEEEE;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #999999;"> 1</span> <span style="color: #000000;">[DataContract] </span><span style="color: #999999;"> 2</span> <span style="color: #000000;"></span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> FatturaDTO </span><span style="color: #999999;"> 3</span> <span style="color: #000000;">{ </span><span style="color: #999999;"> 4</span> <span style="color: #000000;"> [DataMember] </span><span style="color: #999999;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Numero; </span><span style="color: #999999;"> 6</span> <span style="color: #000000;"> [DataMember] </span><span style="color: #999999;"> 7</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> DateTime Data; </span><span style="color: #999999;"> 8</span> <span style="color: #000000;"> [DataMember] </span><span style="color: #999999;"> 9</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RagioneSocialeCliente </span><span style="color: #999999;">10</span> <span style="color: #000000;"> ... </span><span style="color: #999999;">11</span> <span style="color: #000000;">}</span></div></pre></div> <p>(notare la proprietà RagioneSocialeCliente), magari con un costruttore che accetti un'istanza di "Fattura" e popoli i relativi field. Le stringone XML <a href="http://blog.vivendobyte.net/archive/2007/10/25/318.aspx">di questo esempio di Igor</a> sono anch'esse dei DTO, magari in senso lato (ma neanche troppo).</p> <p>BTW, sicuramente si tratta di un approccio dispendioso, che personalmente adotterei solo se ho vincoli che mi impongono una SOA rigorosa. Mi capita spesso, nel lavoro di tutti i giorni, di dover esporre servizi a client Java o PL/SQL, o magari di esporli e basta, senza sapere chi mai li invocherà, con in mano solo un documento di specifiche di forma da rispettare. E in quel caso allora è necessario specificare un insieme di messaggi che standardizzino il protocollo di comunicazione con i miei servizi e che restino immutabili anche a seguito di eventuali modifiche che un giorno farò al mio domain model. I DTO, per l'appunto. </p><p>Molto spesso però - e questo mi sembra proprio il caso di Igor - la reale necessità non è quella di esporre servizi a terze parti, ma <strong>semplicemente quella di avere un'applicazione distribuita</strong>, pur mantenendo stretto controllo di ciò che è in esecuzione sul client e sul server. Per dirla in parole povere, me ne frego dell'interoperabilità e non espongo nulla a nessuno, voglio solo avere la possibilità di interfacciarmi da remoto con una parte della mia applicazione. </p><p>Ottimo. Beh, in questi casi non vedo controindicazioni ad utilizzare direttamente le entity del domain model, se possibile. Dirò di più, magari voglio avere gli stessi tipi di oggetti sia sul client che sul server. Di SOA non ha neanche la più lontana parvenza, ma chi se ne frega? non mi serve avere un'architettura orientata ai servizi.</p> <p>Allora, in uno scenario simile può essere utile anche questo tip.<br /><a href="http://blogs.ugidotnet.org/Crad/archive/2007/04/02/74468.aspx">http://blogs.ugidotnet.org/Crad/archive/2007/04/02/74468.aspx</a></p> <p>Ah... last but not least: invece che con DataContract, i servizi WCF funzionano benone anche con entity marcate semplicemente come Serializable. <img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" /> </p><p> </p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:ecdf522c-9671-48ce-8b9c-00ec6b1021db" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/WCF" rel="tag">WCF</a>, <a href="http://technorati.com/tags/DTO" rel="tag">DTO</a>, <a href="http://technorati.com/tags/SOA" rel="tag">SOA</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/89286.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/10/30/wcf-dto-fatture-e-rapportinomaker-tm.aspx Tue, 30 Oct 2007 01:33:30 GMT http://blogs.ugidotnet.org/Crad/archive/2007/10/30/wcf-dto-fatture-e-rapportinomaker-tm.aspx#feedback 8 http://blogs.ugidotnet.org/Crad/comments/commentRss/89286.aspx [WCF] Condividere la medesima class library tra server e client http://blogs.ugidotnet.org/Crad/archive/2007/04/02/74468.aspx <p>Windows Communication Foundation permette, in maniera estremamente semplice, di utilizzare tipi complessi sia come parametri di un servizio che come valori di ritorno: basta che essi siano marcati o con l'attributo DataContract o Serializable:</p> <p></p> <div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:fbbb42f9-4ca4-432f-9b3f-6cb63bf9c565" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width: 100%"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000">[DataContract] </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> MyClass { </span><span style="color: #008000">//</span><span style="color: #008000"> codice....</span><span style="color: #008000"> </span><span style="color: #000000">} [ServiceContract] </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000"> IMyService { [OperationContract] </span><span style="color: #0000ff">string</span><span style="color: #000000"> MyMethod(MyClass parameter); }</span></div></pre></div> <p></p> <p>Il comportamento di default di svcutil.exe, in fase di generazione del proxy per l'accesso al servizio da parte del client, è quello di creare una classe omonima di MyClass e con i medesimi membri pubblici. Nel caso in cui MyClass sia definita in un assembly referenziato sia dal service che dal client, è tuttavia possibile fare in modo che entrambi questi attori condividano lo stesso tipo, utilizzando il parametro /reference (o la sua versione breve /r) di svcutil.exe. Supponendo che il nome dell'assembly in questione sia <em>CommonTypes</em>, ad esempio, possiamo scrivere:</p> <p></p> <div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:9ef8c9d4-c17e-423d-86b2-ed3870129967" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 585px; padding-top: 0px"><pre style="width: 100%"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000">svcutil</span><span style="color: #000000">.</span><span style="color: #000000">exe </span><span style="color: #000000">/</span><span style="color: #000000">out:</span><span style="color: #000000">"</span><span style="color: #000000">MyServiceClient.cs</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">/</span><span style="color: #000000">language</span><span style="color: #800000">:csharp</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">http://serviceUrl/service.svc</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">/</span><span style="color: #000000">r:</span><span style="color: #000000">"</span><span style="color: #000000">CommonTypes.dll</span><span style="color: #000000">"</span><span style="color: #000000"> </span></div></pre></div> <p></p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:b5e12eba-b287-479d-acc0-305326d81ddc" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/Web%20Services" rel="tag">Web Services</a>, <a href="http://technorati.com/tags/WCF" rel="tag">WCF</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/74468.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/04/02/74468.aspx Mon, 02 Apr 2007 15:03:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/04/02/74468.aspx#feedback 1 http://blogs.ugidotnet.org/Crad/comments/commentRss/74468.aspx [WCF] Attenzione alle Using http://blogs.ugidotnet.org/Crad/archive/2007/03/04/72294.aspx <p>In Windows Communication Foundation, il proxy creato da svcutil eredita dalla classe ClientBase&lt;T&gt;, che a sua volta implementa l'interfaccia IDisposable. Conseguenza di questo fatto è che viene naturale invocare il nostro bel servizio scrivendo:</p> <p></p> <div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:33a0749d-11c1-4c63-a89c-5a70d4cb4121" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;background-color:#EEEEEE;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF;">using</span><span style="color: #000000;"> (MyServiceClient client </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> MyServiceClient()) { </span><span style="color: #008000;">//</span><span style="color: #008000;"> more code goes here...</span><span style="color: #008000;"> </span><span style="color: #000000;">}</span></div></pre></div> <p></p> <p>Ma se l'invocazione genera un errore, cosa accade? L'utilizzo del blocco using ci garantisce che venga chiamato il metodo Dispose() di MyServiceClient, che, Reflector alla mano,&nbsp;non fa altro che invocarne il metodo Close().</p> <p>Attenzione però all'eccezione rilanciata se lo stato del client è Faulted (accade ogni volta che si verifica un errore non recuperabile, ad es. il server ha chiuso la connessione): in questo caso, infatti, al posto di Close andrebbe invocato il metodo Abort. L'uso di Close determina il sollevarsi di una CommunicationObjectFaultedException che oscura completamente l'errore verificatosi all'interno del blocco using.</p> <p>Per ovviare a questo problema, ho costruito una classe helper che chiude il client in maniera un po' più furba:</p> <p> <div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:35c3d173-3b0c-4bc0-8db2-a7478d736aa0" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;background-color:#EEEEEE;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> SafeClose: IDisposable { </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> ICommunicationObject communicationObject; </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> SafeClose(ICommunicationObject co) { communicationObject </span><span style="color: #000000;">=</span><span style="color: #000000;"> co; } </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> Dispose() { </span><span style="color: #0000FF;">try</span><span style="color: #000000;"> { </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (communicationObject.State </span><span style="color: #000000;">!=</span><span style="color: #000000;"> CommunicationState.Faulted) communicationObject.Close(); } </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> { communicationObject.Abort(); } } }</span></div></pre></div></p> <p>La sintassi di utilizzo è solo di poco più prolissa:</p> <p> <div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:8c39dbe6-7ade-48a7-a815-d5b5cc8bf606" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;background-color:#EEEEEE;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000;">MyServiceClient client; </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> SafeClose(client </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> MyServiceClient())) { Console.WriteLine(client.MyMethod()); }</span></div></pre></div></p> <p>HTH.</p> <p>Ciao <img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif"></p><img src="http://blogs.ugidotnet.org/Crad/aggbug/72294.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/03/04/72294.aspx Sun, 04 Mar 2007 18:27:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/03/04/72294.aspx#feedback http://blogs.ugidotnet.org/Crad/comments/commentRss/72294.aspx [WCF] Problemi con l'hosting su IIS http://blogs.ugidotnet.org/Crad/archive/2007/02/20/71230.aspx <p>Altro tip su WCF (giuro, è in buona fede, non partecipo a Community Credit, ehhehe!!)</p> <p>Una volta effettuato il deploy di un servizio WCF su IIS, ho purtroppo constatato che il file .svc veniva fornito in output come semplice plain text. Occhiata al metabase di IIS e, sorpresa... non era presente alcun binding tra questa estensione e ASP.NET.</p> <p>La causa è da ricercarsi in un bug dei primi installer di .NET 3.0 che creavano dei problemi alla configurazione di IIS. Per risolverli è sufficiente digitare, da prompt dei comandi,</p> <p> <div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:96a7320c-0df3-4468-9bb9-b28a0d38c398" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000;">&quot;</span><span style="color: #000000;">%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe</span><span style="color: #000000;">&quot;</span><span style="color: #000000;"> </span><span style="color: #000000;">/</span><span style="color: #000000;">s</span><span style="color: #800000;">:W3SVC</span></div></pre></div></p> <p>Maggiori dettagli in <a href="http://blogs.msdn.com/wenlong/archive/2006/09/10/748294.aspx">questo post</a>.</p> <p>HTH.</p><img src="http://blogs.ugidotnet.org/Crad/aggbug/71230.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/02/20/71230.aspx Tue, 20 Feb 2007 17:26:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/02/20/71230.aspx#feedback http://blogs.ugidotnet.org/Crad/comments/commentRss/71230.aspx [WCF] Non vi funziona l'intellisense nell'app.config? http://blogs.ugidotnet.org/Crad/archive/2007/02/20/71227.aspx <p>Anche con le VS2005 Extension for WCF e WPF installate, può capitare che Visual Studio non mostri correttamente l'intellisense degli elementi di configurazione relativi a Windows Communication Foundation.</p> <p>Come risolvere? Se avete un luminare come <a href="http://dotnetside.org/blogs/fabio/">Fabio Cozzolino</a> tra i contact di MSN è un gioco da ragazzi, basta chiedere a lui! :D</p> <p>Altrimenti, eseguite nuovamente l'installazione delle estensioni, ma digitando</p> <p> <div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:c9cdd8ea-3aae-434b-ac1d-48af1207286b" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000;">msiexec </span><span style="color: #000000;">/</span><span style="color: #000000;">i vsextwfx</span><span style="color: #000000;">.</span><span style="color: #000000;">msi WRC_INSTALLED_OVERRIDE</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span></div></pre></div></p> <p>da riga di comando!</p><img src="http://blogs.ugidotnet.org/Crad/aggbug/71227.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/02/20/71227.aspx Tue, 20 Feb 2007 16:50:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/02/20/71227.aspx#feedback http://blogs.ugidotnet.org/Crad/comments/commentRss/71227.aspx Un aspetto che non mi piace di WCF http://blogs.ugidotnet.org/Crad/archive/2007/02/20/71210.aspx <p>In questi giorni in azienda ho iniziato ad utilizzare&nbsp;<a href="http://wcf.netfx3.com/">Windows Communication Foundation</a> piuttosto intensamente e mi sono fatto un'idea di massima (ancora MOOOLTO grossolana) su questa parte del .Net FX 3.0.</p> <p>Mi piace parecchio il nuovo <a href="http://msdn2.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx">DataContractSerializer</a> (AKA XmlFormatter), grazie al quale riusciamo ad avere oggetti lato client molto più simili alle controparti server side. Mi piace (ovviamente) la tanto decantata possibilità di creare servizi indipendenti dalla tecnologia utilizzata, anche se tutta da verificare nella pratica, mi piace il fatto che si possa personalizzare il formato dei&nbsp;messaggi scambiati tra client e server e che si possano creare metodi che lavorino direttamente su di essi, piuttosto che su oggetti a più alto livello.</p> <p>Per il momento, c'è un solo aspetto che proprio non riesco a digerire, ossia il fatto che per usare WCF sia costretto a decorare le mie interfacce, metodi e classi con custom attributes, il che implica ricompilazione di codice e reference a System.ServiceModel un po' ovunque... </p> <p>Nelle applicazioni che sviluppo qui in azienda, i servizi sono disaccoppiati dalla tecnologia utilizzata ed esposti tramite interfacce, il che mi consente di swappare tra WebService ASP.NET, WSE 3.0 o Remoting (in alcuni casi e con alcune ovvie limitazioni) agendo semplicemente sulla configurazione. </p> <p>WCF, in questo contesto, mi crea qualche grana in più e credo che sarebbe stato molto più elegante specificare queste informazioni in un file esterno, in maniera quindi molto meno "invasima".</p><img src="http://blogs.ugidotnet.org/Crad/aggbug/71210.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/02/20/71210.aspx Tue, 20 Feb 2007 12:38:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/02/20/71210.aspx#feedback 2 http://blogs.ugidotnet.org/Crad/comments/commentRss/71210.aspx Nuovo Yahoo Messenger in WPF!! http://blogs.ugidotnet.org/Crad/archive/2007/01/08/yahoo_messenger_in_wpf.aspx <p>In <a href="http://blogs.ugidotnet.org/crad/archive/2007/01/03/64692.aspx">questo post</a> dicevo che, per ciò che ho avuto modo di vedere, non immagino la tipica applicazione gestionale realizzata in WPF. Questa nuova tecnologia, secondo me, ha ben altri scopi, dato che "non di soli gestionali vive il programmatore", no?</p> <p>Ecco perché, a mio modo di vedere, forse il famoso <a href="http://wpf.netfx3.com/files/folders/applications/entry6608.aspx">Healthcare Prototype</a>, che comunque ha lasciato tante bocche spalancate, è un esempio un po' fuorviante.</p> <p>Chi invece credo beneficerà alla grande delle peculiarità di WPF e ci farà toccare con mano cosa vuol dire avere a disposizione una tale potenza e flessibilità per la UI sono i software di messaggistica, utilizzati dai 15enni e dai 50enni e che, per loro natura, traggono pieno profitto da un look più accattivante.</p> <p>Tutto questo preambolo, per dire cosa? Beh, che Yahoo per prima, con il suo Messenger, ha voluto tastare il terreno e si avvia al rilascio di una versione interamente .NET 3.0 e WPF powered, con tanto di supporto alla Sidebar di Vista.</p> <p><a href="http://www.marcodesanctis.it/images/Blog/NuovoYahooMessengerinWPF_90CC/yahoo111.jpg" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="180" src="http://www.marcodesanctis.it/images/Blog/NuovoYahooMessengerinWPF_90CC/yahoo11.jpg" width="240" border="0"></a> </p> <p>Se fate un giro sul <a href="http://messenger.yahoo.com/windowsvista.php">sito ufficiale</a> avrete la possibilità di guardare anche un filmato dimostrativo.</p> <p>fonte: <a title="http://weblogs.asp.net/scottgu/archive/2007/01/07/next-generation-yahoo-messenger-built-with-wpf-and-net.aspx" href="http://weblogs.asp.net/scottgu/archive/2007/01/07/next-generation-yahoo-messenger-built-with-wpf-and-net.aspx">http://weblogs.asp.net/scottgu/archive/2007/01/07/next-generation-yahoo-messenger-built-with-wpf-and-net.aspx</a></p><img src="http://blogs.ugidotnet.org/Crad/aggbug/65453.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/01/08/yahoo_messenger_in_wpf.aspx Mon, 08 Jan 2007 11:18:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/01/08/yahoo_messenger_in_wpf.aspx#feedback 1 http://blogs.ugidotnet.org/Crad/comments/commentRss/65453.aspx Prime impressioni su WPF http://blogs.ugidotnet.org/Crad/archive/2007/01/03/64692.aspx <FONT face=Verdana size=2> <P>Durante le festività natalizie, ho avuto modo di papparmi un paio di centinaia di pagine del libro di Charles Petzold su WPF; per il momento, ho toccato pochissimo (quasi nulla) XAML, dato che la prima metà del libro non lo tratta. Questa scelta, che inizialmente mi aveva lasciato piuttosto perplesso, è in realtà completamente giustificata: XAML altri non è che un modo per serializzare una gerarchia di oggetti e quindi, alla fine dei conti, in WPF riveste comunque il ruolo di "<EM>accessorio</EM> ", per quanto di fondamentale importanza; morale della favola: per studiare l'architettura di WPF se ne può fare benissimo a meno, in compenso ho scritto tanto codice C# e ho iniziato ad esplorare un po' il modello a oggetti del nuovo framework.</P> <P>L'impressione è quella di trovarsi davanti a qualcosa di mastodontico, sia per quanto riguarda potenzialità e flessibilità, che a livello di complessità: nonostante il mio background professionale si basi per un buon 80% sul mondo delle applicazioni windows, i primi test mi hanno lasciato piuttosto spaesato. Le gerarchie degli oggetti sono estremamente più profonde rispetto a quelle delle WinForms 2.0, ma quest'approccio, che denota uno sforzo architetturale non da poco,&nbsp;ha permesso di implementare nativamente funzionalità evolute delle quali chiunque si sia occupato in passato di applicazioni windows ha sentito la necessità almeno una volta. </P> <P>DependencyProperties, AttachedProperties (trattate da&nbsp;<A title="" href="http://blogs.ugidotnet.org/corrado/" target="" name="">Corrado</A> rispettivamente <A title="" href="http://blogs.ugidotnet.org/corrado/archive/2006/08/09/46020.aspx" target="" name="">qui</A> e <A title="" href="http://blogs.ugidotnet.org/corrado/archive/2006/08/11/46131.aspx" target="" name="">qui</A> )&nbsp;e soprattutto&nbsp;il nuovo modello di routing degli eventi sono un'autentica manna dal cielo e vi assicuro che, nonostante magari possano sembrare un qualcosa di "<EM>inedito</EM>" rispetto a ciò che era la programmazione windows in passato, dopo un po' non se ne riesce veramente a fare a meno e tornare a Winforms dà una sensazione un po' di "vecchio". </P> <P>Da appassionato, insomma, sono veramente entusiasta, ma resto ancora perplesso circa la diffusione che questo framework potrà avere presso il grande pubblico. Secondo me le Windows Forms avranno ancora vita lunghissima, WPF è decisamente complesso e soprattutto differente da tutto ciò che si è visto in passato, con il risultato che il passaggio a questa tecnologia potrebbe risultare molto ma molto costoso. E' ancora un po' presto per tirare le somme, mancano ancora tool di sviluppo <EM>concreti</EM> e anche la libreria di controlli è un po' lacunosa (il DateTimePicker dov'è?), ma allo stato attuale non riesco proprio ad immaginare la piccola/media software house che decida di sviluppare il proprio gestionale in WPF, ne ritengo molto più plausibile un utilizzo, ad es., per la produzione di una presentazione multimediale o per un software semplice ma che necessiti di essere graficamente accattivante. </P> </FONT> <FONT face=Verdana size=2><P><A href="http://imhoproject.org/"><FONT face=Verdana size=1>powered by IMHO 1.3</FONT></A></P></FONT><!-- Powered by IMHO 1.3 (IT) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --> <img src="http://blogs.ugidotnet.org/Crad/aggbug/64692.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/01/03/64692.aspx Wed, 03 Jan 2007 13:21:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/01/03/64692.aspx#feedback 1 http://blogs.ugidotnet.org/Crad/comments/commentRss/64692.aspx [Libro] Applications = Code + Markup http://blogs.ugidotnet.org/Crad/archive/2006/11/21/Application_Code_Markup.aspx <p>Dopo neanche una settimana dall'ordine (<a href="http://www.amazon.co.uk">Amazon.co.uk</a> tutta la vita, altro che shopping negli states), la mia simpatica postina ha lasciato nella cassetta delle lettere <a href="http://www.amazon.co.uk/Applications-Code-Markup-Presentation-Foundation/dp/0735619573/sr=8-2/qid=1164065156/ref=sr_1_2/202-3503695-5673441?ie=UTF8&amp;s=books">Applications = Code + Markup</a>&nbsp;e questa sera ho dato una sbirciatina veloce al contenuto.</p> <p>Ora, premetto che è assolutamente presto per dare un giudizio, dato che ho guardato l'indice, sfogliato il libro qua e là e letto un paio di pagine, ma...</p> <ol> <li>La copertina rigida rullezza, e ci troviamo davanti un gran bel tomo da un migliaio di pagine circa</li> <li>Mi sembra scritto in maniera piuttosto semplice e chiara, almeno da quel poco (facciamo pure quasi nulla) che ho letto</li> <li>L'han detto in tanti, lo ripeto anch'io: mi sembra assurdo che un libro su WPF sia praticamente privo di immagini</li> <li>L'impostazione non mi convince</li></ol> <p>Spiego meglio il punto 4: le circa 1000 pagine sono divise in due grosse sezioni, Code e Markup, come dice il titolo. In pratica, quindi, per tutta la prima metà del libro, scordatevi pure ogni forma di XAML, non se ne trova ombra. Ci sono, invece, centinaia di snippet di codice (ben spiegati, a quanto mi è sembrato) in cui l'applicazione è "disegnata" istanziando a mano ogni componente.</p> <p>Viceversa, la seconda parte, pur essendo basata prevalentemente sul markup, presenta comunque un po' di esempi di code-behind (diciamo che siamo 75% XAML e 25% C#).</p> <p>Che dire, ora come ora sono un po' perplesso, perché snippet chilometrici che costruiscono menu, button e textbox secondo me lasciano un il tempo che trovano: certo, è importante conoscere l'object model, ma alla fine non credo che nessuno disegnerà mai Form (pardon, Window <img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif">) in questo modo. Di buono c'è che il libro sembra coprire parecchi aspetti di WPF, dal data binding alla gestione degli eventi, passando per resources, brushes, ecc.ecc.ecc...</p> <p>Staremo a vedere, tra qualche giorno inizio a papparmelo. </p><img src="http://blogs.ugidotnet.org/Crad/aggbug/55688.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2006/11/21/Application_Code_Markup.aspx Tue, 21 Nov 2006 01:42:00 GMT http://blogs.ugidotnet.org/Crad/archive/2006/11/21/Application_Code_Markup.aspx#feedback 4 http://blogs.ugidotnet.org/Crad/comments/commentRss/55688.aspx