The Dark Side of .NET

Il lato oscuro della forza!

January 2010 - Post

13° Workshop DotNetMarche: qualche foto

E’ stato un lungo anche se piacevole viaggio, le sessioni molto interessanti, specie quella sulla UI Composition, sono riuscito a bloggare live ma purtroppo non riuscivo a seguire e scrivere quindi nei post precedenti trovate giusto qualche spunto di quello che si è detto. La delegazione DotNetCampania è stata di 4 persone: io, Alessandro, Nicola e Antonio. Ci siamo divertiti un sacco! Vi lascio qualche foto dell’evento in attesa delle foto di Nicola sul viaggio, pranzo e cena!

DSC_0424 (Small) DSC_0426 (Small)
DSC_0427 (Small) DSC_0428 (Small)
DSC_0430 (Small) DSC_0431 (Small)
DSC_0434 (Small) DSC_0436 (Small)
DSC_0437 (Small) DSC_0438 (Small)
DotNetMarche: UI Composition con Mauro Servienti e Paolo Possanzini

UI Composition: fare injection di componenti della UI da qualche parte, pensiamo ad esempio un plugin. Con WPF possiamo farlo senza spararci!

Perchè ci serve fare UI Composition?

  • Cliente: necessità di modularizzare:
    • Acquistare in configurazioni diverse
    • installare in configurazioni diverse
  • Team: necessità di gestire e lavorare

Che problemi ci pone?

  • Region Management
  • Comunicazione tra attori che non si conoscono
  • Gestione ciclo di vita plugin/modulo
  • Obbligatorietà di IoC perchè bisogna avere a che fare con i contratti

Le Region, che sono le parti della UI in cui iniettiamo i nostri controlli, possono essere  statiche o dinamiche, quelle statiche le possiamo individuare semplicemente con il nome, quelle dinamiche invece hanno bisogno di nome + contenitore che ci ospita. WPF e XAML ci danno massima libertà grazie alle Attached Property.

Ma come comunicano i vari elementi di interfaccia iniettati? Utilizzando un MessageBroker che ci permette di definire oggetti di tipo IMessage e spedirli: i moduli interessati a ricevere i messaggi si sottoscrivono al broker.

Prism è un framework di UI Composition, disponibile su codeplex in due versioni, la 1 e la 2. Nella 1 non sono supportate le region dinamiche. Funziona sia con Silverlight che con WPF.

DotNetMarche: M-V-VM con Mauro Servienti

Mauro ci parla di Model View ViewModel. Durante lo sviluppo  di un’applciazione complessa ci devono spaventare:

  • static: come lo testiamo? E se mantiene uno stato? Se vogliamo cambiare il comportamento?
  • new: come lo testiamo? Se vogliamo cambiare il comportamento?
  • Serviceprovider.GetService<T>()

Esternalizzando le dipendenze, dependency injection, possiamo di risolvere questi problemi, possiamo testare e mockare come volgiamo e possiamo iniettare tutti i comportamenti che vogliamo. In particolare l’injection possiamo farla via costruttore o via property (optional vs Mandatory). Introduciamo quindi le interfacce e mediante IoC chiediamo a qualcun altro di istanziare la classe concreta per noi. Naturalmente in un’applicazione corposa questo meccanismo potrebbe far esplodere il codice, inoltre per i servizi può essere inutile avere un’istanza nuova per ogni richiesta.

Model View ViewModel fa, con modalità diverse, la stessa cosa di Model View Presenter: separa la presentazione dei dati dal Model. In particolare sfrutta la potentissima infrastruttura di binding e commanding di WPF. I vantaggi sono tanti:

  • mediatore della comunicazione
  • il designer non deve scrivere codice
  • sfrutta il potentissimo motore di binding e commanding di wpf
  • aggiunta di behavior ad un grafo (es. delete command su una row)
  • semplificazione dello xaml perchè può ridurre drasticamente l’uso dei converter

Il ViewModel è una banale classe che implementa INotifyPropertyChanged e basta! Si potrebbe essere tentati di dipendere da DependencyObject ma introduciamo una dipendenza da tutto wpf al solo scopo di avere la notifica simile a INotifyPropertyChanged. Ci basta mettere un’istanza di questa classe nel datacontext della nostra view per accedere al suo contenuto. Su un dominio complesso passiamo la vita a scrivere ViewModel/DTO.

Considerazioni:

  • View first o ViewModel first?
    • La blendability è importante
    • Come comunicano View e ViewModel:
      • uno per tutti: interecettare la chiusura della View
  • In ottica Dependency Injection se il ViewModel ha delle dipendenze mandatory la View First ve la siete giocata
  • A questo punto DI ci porta verso IoC quindi è necessariamente Viewmodel First

Pregi:

  • testabilità della logica della UI
  • sotituibilità della UI (stesso View Engine)
  • elevata manutenibilità

Difetti:

  • Aumento della complessità e mancanza di controllori
  • Il data binding non risolve tutti gli scenari (es. la chiusura della view con messagebox)

Non è tutto oro quello che luccica:

  • Passate la vita a scrivere wrapper/dto
  • Il processo di validazione: IDataErrorInfo,  ma come triggheriamo?
  • Localizzazione: LocBAML… ahahah che ridere…
  • è produttivo? Dipende da cosa intendiamo per produttivo:
    • pessimo supporto dei designer
    • struttura della solution obbliga alla rebuild
    • possiamo testare tutto, quasi;
    • elevatissima manutenibilità;
  • E’ performante? Si, ma che importa? :-)

E’ un mito quest’uomo!

DotNetMarche: WPF Basics con Paolo Possanzini

Eccoci qui al 13° workshop di DotNetMarche su WPF. A Paolo il compito di illustrarci la differenza tra Windows Form e WPF. Cosa hanno in comune Windows Form e WPF? Niente:

  • Nuovo linguaggio di programmazione per lo sviluppo della grafica (XAML)
  • Nuovo modello ad oggetti per rappresentare la UI
  • nuovo modello di propagazione degli eventi
  • Nuovo modello di gestione dei comandi
  • Nuovo modello di binding
  • Grafica vettoriale

Attraverso l’uso di XAML possiamo dichiarare oggetti e creare oggetti, sottoscrivere eventi, impostare proprietà e manipolare dati. Per la generazione dello xaml è possibile usare visual studio oppure blend, il primo più orientato ai programmatori, il secondo più orientato ai grafici. Andrea ci mostra come creare una semplice applicazione con un pulsante da Visual Studio e poi come cambiarne l’aspetto grafico attraverso l’uso di expression blend.

I controlli più usati in WPF sono sicuramente i contenitori, con i quali possiamo impostare varie forme di layout, come quello tabellare, nel quale possiamo poi trascinare i controlli dell’interfaccia che si adatteranno alla finestra in base al tipo di controllo che abbiamo deciso di usare.

Quando costruisco interfacce grafiche in WPF la logica del controllo (un pulsante fa il pulsante) è separata dalla sua visualizzazione. A questo scopo vengono creati un logical tree e un visual tree, il primo è l’albero dei controlli che sono presenti nell’interfaccia, il secondo invece è l’albero contenente la rappresentazione grafica dei controlli presenti nell’interfaccia. Grazie a questo meccanismo posso cambiare totalmente l’aspetto grafico di un controllo senza alterarne il funzionamento.

Passando al motore di binding di WPF, è possibile ad esempio bindare i valori dei controlli tra di loro, ad esempio uno slider e una textblock mostrando nella textblock il valore corrente dello slider. Questo in maniera completamente dichiarativa attraverso l’uso di XAML:

Text = {Binding  Value, ElementName=slider, Mode=Default}

Ci sono 4 modalità di binding:

  • Bidirezionale
  • OneWay dalla sorgente alla View
  • OneWaytoSource dalla view alla sorgente dati
  • OneTime, una sola volta dalla sorgente alla view

Ma il tempo è tiranno, le cose da dire sarebbero tante, sicuramente abbiamo solo scalfito la superficie.

Workshop DotNetMarche: noi ci saremo!

Non ci lasceremo scappare neanche quest’occasione di fare un bel viaggetto tutti insieme verso un evento community! E’ la volta di DotNetMarche e il 13° Workshop "Tra presente e futuro delle interfacce utente con WPF e MVVM". L’agenda è bella ricca e la presenza di Mauro Servienti rende la giornata veramente imperdibile! Nei limiti del possibile (segnale wind e/o varie ed eventuali) bloggerò live come al solito le varie sessioni quindi chi non ci potrà essere può restare sintonizzato sul mio blog per aggiornamenti, per chi ci sarà ci vediamo domani, anzi visto l’orario… più tardi!!!!

Associazione Culturale DotNetCampania

Grazie agli ottimi feedback ottenuti sul territorio e grazie al supporto dei nostri utenti DotNetCampania ha fatto il grande passo: da oggi siamo un’associazione no-profit legalmente riconosciuta, denominata “Associazione Culturale DotNetCampania”, con C.F.: 95127870632.

logo

Volevo ringraziare Alessandro Scardova di DotDotNet per l’aiuto giuridico: tra lo statuto, l’atto costitutivo e il verbale ci ha dato un aiuto davvero importante! Un grosso grazie va a tutti i nostri utenti che costantemente ci supportano e ci incoraggiano a fare sempre di più. Un grazie anche ad Andrea Saltarello, a cui spesso chiediamo consigli su come far crescere la nostra community e che con grande gentilezza ci mette a disposizione la sua grande esperienza. Un grazie anche agli sponsor che ci aiutano a realizzare eventi, tra cui il Web Development Day, che si terrà il 5 Febbraio a Napoli:

Web Development Day

Le iscrizioni sono aperte e i posti limitati: affrettatevi!

Visual Studio 2010 sarà rilasciato il 12 Aprile 2010

Pare che ci siamo, alla fine non è stato un grande ritardo:

http://blogs.msdn.com/robcaron/archive/2010/01/13/9948172.aspx

Quindi il lancio sarà Lunedì 12 Aprile 2010!

Diario di bordo DotNetToscana Community Tour

Volevo scrivere un post su come è stato il viaggio andata e ritorno pisa-napoli-pisa per assistere al community tour degli amici di dotnettoscana, ma il nostro grande massimiliano mi ha preceduto:

http://dotnetcampania.org/blogs/massimiliano/archive/2010/01/13/dotnettoscana-community-tour-diario-di-bordo.aspx

Aggiungo giusto qualche foto:

SNC00257 SNC00258
SNC00259 SNC00260
SNC00261  SNC00262
SNC00263 SNC00264
SNC00265 SNC00266
SNC00272 SNC00275

Troppo bella la vita di community!

DotNetToscana Community Tour: ASP.NET MVC

Matteo Baglini e Mario Martellini ci presentano ASP.NET MVC, il nuovo framework per sviluppare applicazioni web secondo il pattern Model-View-Controller,utilizzando url seo friendly, rendendo  il codice facile da testare.

Il pattern MVC isola la logica applicativa dalla UI fornendo semplicità, manutenibilità e testabilità. Dal browser parte una richiesta che viene processata dal motore di routing (viene analizzato l’url richiesto) che seleziona il controller appropriato per la richiesta. Il controller esegue le operazioni sul model e seleziona la view da visualizzare in risposta alla richiesta.

Requisiti minimi: VS2008 SP1 + installazione del framework MVC. Da nuovo progetto possiamo creare attraverso il template installato un nuovo progetto MVC, grazie al quale viene creata la struttura del sito. Troviamo tre principali cartelle

  • Controllers: che conterrà i controller per le varie richieste
  • Models: che conterrà la logica di business
  • Views: le pagine aspx che rappresentano le view, con una sottocartella per ogni controller (stesso nome del controller senza la dicitura Controller)

Le view possono essere di due tipi: tipizzate e non. Quelle tipizzate permettono l’accesso ai dati in maniera tipizzata, quelle non tipizzate utilizzano l’oggetto ViewData insieme a degli HTML Helper.

Supponendo di avere già un model (nel nostro caso Linq.to Sql su northwind + un’interfaccia e una classicina che interrogano i dati per noi) si parte dalla creazione del controller di una determinata richiesta, rispettando la convenzione <nome>Controller. Visual Studio ci permette di creare già i metodi per le classiche operazioni CRUD, che noi andremo ad implementare invocando il nostro model. A questo punto creiamo le View: nella cartella Views, cartella col nome del nostro controller, aggiungiamo una nuova pagina aspx, che chiamiamo con lo stesso nome del metodo del controller che la gestisce. Visual studio ci chiede se vogliamo usare un template particolare nella generazione della view, in modo da evitarci parte della scrittura del codice della view.

Uno dei vantaggi di questo meccanismo è che è semplice testare la logica applicativa testando individualmente i vari controller che compongono il progetto, sostituendoci alle view con degli Unit Test: creiamo un test class per ogni controller e un test method per ogni metodo del controller, in cui instanziamo il controller che vogliamo testare e ne invochiamo il metodo interessato dal test. L’invocazione di un metodo del controller ci restituisce il ViewResult che noi possiamo analizzare per realizzare le nostre Assert. Per svincolare i nostri test dal database utilizzato realizziamo un’implemetazione fake dell’interfaccia del nostro model.

Volendo confrontare MVC con WebForm possiamo dire:

ASP.NET MVC:

  • semplicità
  • basato su convenzioni
  • completamente estendibile
  • facilmente testabile
  • pieno controllo dell’html ed il javascript
  • adatto a scenari SEO e REST
  • Open Source

ASP.NET WebForm

  • Sviluppo RAD
  • Ricchi controlli
  • non richiede particolari conoscenze web
  • Modello Even-Driven

Hanno in  comune:

  • Master Page
  • Globalizzazione
  • Output Cache
  • Autenticazione e Autorizzazione

Quale utilizzare? Come al solito… Dipende!

DotNetToscana Community Tour: IE8 per gli sviluppatori

Marco Minerva ci presenta le nuove funzionalità di IE8 per gli sviluppatori, cominciando dalla Developer Toolbar, la quale ci permette:

  • Analisi del codice HTML
  • Analisi dei CSS
  • Profiling e debug degli script
  • Site Compatibility

Questo tool ci permette di modificare l’html e gli stili della pagina e in tempo reale vedere le modifiche nella pagina. Possiamo inoltre debuggare il codice javascript con il classico breakpoint o profilarlo con il profiler che ci da i vari tempi di esecuzione delle funzioni nella pagina. Possiamo poi chiedere al browser di usare il rendering delle versioni precedenti del browser per verificare

Mediante un meta tag possiamo anche chiedere a IE di usare il renderizzatore di versioni precedenti di explorer in modo da ovviare velocemente a problemi di compatibilità tra le varie versioni del browser:

<meta content=”IE=Emulate IE7” http-equiv=”X-UA-Compatible” />

In IE8 Standard Mode (quindi in modalità compatibilità non funziona)  possiamo gestire i pulsanti avanti e indietro del browser in applicazioni Ajax: ogni passaggio Ajax è contrassegnato da un valore nell’indirizzo della pagina, usando window.location.hash (disponibile anche in firefox 3.5) e con l’evento onhashchange() possiamo ripristinare i valori di hash voluti. Questa è la soluzione javascript, in ASP.NET è possibile usare la History management API: si imposta nello script manager EnableHistory a true, possiamo invocare sull’oggeto scriptmanager il metodo AddHistoryPoint() e sull’evento Navigate possiamo, grazie alla proprietà State dell’HistoryEventArgs, ripristinare come vogliamo il valore corrente del navigation point e forziamo l’aggiornamento dell’updatepanel.

IE8 introduce le Web Slice: una porzione di pagina web che vogliamo tenere sotto controllo che viene aggiunta alla barra dei preferiti. Tecnicamente basta mettere nella pagina dei particolari tag div (class=”hslice” id=”idwebslice”) se vogliamo impostare un titolo (class=”entry-title”) e il link dl contenuto (rel=”entry-content”). Una Web Slice è evidenziata da un rettangolo verde quando si seleziona con il mouse, si installano tramite comando Javascript (window.external.AddToFavorite()). L’add-on WebChuncks ne permette l’utilizzo anche in Firefox.

In alternative ai cookie IE8 implementa il DOM Storage per memorizzare informazioni durante la navigazione su un sito: spazio 10 MB (firefox 5 MB), disponibile come Session storage e Local Storage,. Non hanno scadenza e possono essere permanenti: il controllo è lasciato allo sviluppatore. Non sono trasmessi al server ad ogni richiesta Web. Vengono generati eventi onstorage e onstoragecommit per ricevere notifiche  sugli aggiornamenti del DOM storage. Ci si accede da javascript mediante la proprietà window.sessionstorage.

Sono stati introdotti anche i Web Accelerator: menu contestuali con una serie di comandi che hanno lo scopo di facilitare la navigazione. Vengono definiti mediante file XML secondo uno standard denominato OpenService. Si installano da javscript  mediante window.external.AddService(‘url xml’). Non è supportato in firefox.

Altre novità sono:

  • supporto nativo a JSON (serializzazioni e deserializzazioni più veloci)
  • Visual Search Providers

Nelle slide di Marco che saranno pubblicate sul sito di dotnettoscana potrete trovare tutti i link utili per gli argomenti trattati.

Un grazie a Marco!

DotNetToscana Community Tour: Silverlight e WCF RIA Services

In diretta dal Polo Tecnologico di Navicchio (Pisa) una delegazione di DotNetCampania composta da me, Marcello, Massimiliano e Giorgio sta seguendo la sessione di Pietro Brambati su Silverlight e RIA Services.

Pietro ci illustra alcuni requisiti dalle comuni aplicazioni di business:

  • Aspetto professionale
  • Sviluppata su più Tier
  • Tanta Business Logic
  • Validazione

WCF RIA Services ci semplifica l’utilizzo di WCF per sviluppare servizi CRUD, permettendoci di essere indipendenti dal  DAL e dal Presentation Layer. Si parte subito con una demo in cui ci viene illustrato come creare con Visual Studio 2010 Beta 2 un progetto Silverlight RIA Services, aggiungendo un entity data model per l’accesso ai dati. Aggiungendo un Domain Service Class (che vi trovate in elenco dopo aver installato i RIA Services) nel progetto di back-end possiamo in maniera RAD creare il servizio associato all’entità che vogliamo gestire. Senza aggiungere il service reference (tra le cartelle non incluse nel progetto silverlight trovate una cartella Generated_Code che contiene i riferimenti al servizio creati da visual studio dopo la compilazione del servizio) e usando il tab Data Sources di Visual Studio 2010 possiamo draggare i dati esposti direttamente nel nostro xaml, lasciando quindi all’ambiente l’onere di impostare il binding al servizio WCF mediante l’utilizzo di controlli appositi, i RIA Controls. Grazie a questi controlli possiamo fare tutte le solite operazioni che siamo abituati a fare con gli insiemi di dati: raggruppamento, ordinamento, filtraggio, ecc.

Un altro controllo interessante è il DataForm, grazie al quale possiamo creare form di dettaglio in cui possiamo editare i singoli campi della riga correntemente selezionata, implementando classici scenari Master-Detail. Interessante è la validazione dei campi, che mediante il classico meccanismo degli attributi ci permette di portare lato client le regole di validazione che impostiamo lato server.

Impostando l’applicazione in modalità out of browser e con privilegi elevati possiamo collegare la nostra applicazione ad esempio ad excel per esportare i dati in questo formato.

Sala confermata: il Web Development Day diventa realtà!

Alla fine l’impegno profuso nell’organizzazione di una giornata dedicata allo sviluppo web ha dato i suoi frutti: proprio oggi il nostro partner, Computer Forensic di Lorenzo Laurato, ci ha confermato la disponibilità della sala promessaci per l’evento!

web-development-day

Sarà il 5 Febbraio, un’intera giornata dedicata allo sviluppo web, con 6 sessioni che vanno dalla realizzazione del layout di applicazioni web con Expression Studio, al deploy di applicazioni Asp.Net su linux con mono, passando per Asp.Net Web Form, Asp.Net MVC, Silverlight, RIA Services e WCF! Il nostro Alessandro poi ci illustrerà come realizzare controlli Ajax con Asp.Net, portandoci in sala la sua esperienza quotidiana!

Potete trovare l’agenda provvisoria e le prime info logistiche al seguente link:

http://dotnetcampania.org/content/WebDevelopmentDay.aspx

Presto saranno aperte le iscrizioni, i posti come sempre sono limitati quindi…occhio al portale!

Michele