in

DotNetMarche

.NET Framework User Group delle Marche

This Blog

Syndication

ExternalBlogs

July 2012 - Posts

  • Il nuovo App-Model di SharePoint 2013 - Parte 1

    Come vi dicevo , SharePoint 2013 vede moltissime novità per noi sviluppatori. Prima fra tutte, il nuovo modello App-oriented, per la costruzione di applicazioni personalizzate basate sulla piattaforma di collaborazione Microsoft. Nota : vi ricordo che...
  • Sono io CQRS?

    Decisamente l’acronimo CQRS ultimamente è una delle buzzwords più in voga del momento e talvolta ci si scatenano dietro guerre di religione. In sostanza si parla di CQRS quando noi utilizziamo due modelli differenti, uno dedicato alla modifica dei dati (la parte di Commanding) ed uno dedicato alla lettura dei dati (la parte di query).

    Di base CQRS non è nemmeno un pattern, ma piuttosto una organizzazione architetturale che può essere declinata in tanti modi differenti, soprattutto in base alle necessità del progetto corrente (leggi requisiti). Approcciare un problema direttamente con CQRS+EVENT SOURCING+BLABLABLA senza che effettivamente ci sia necessità è la strada migliore per “farsi male”, piuttosto è necessario capire perché nasce CQRS, che problemi risolve e come posso declinarlo in strutture esistenti ed in nuovi progetti.

    Se si lavora con NHibernate e si cerca di realizzare un Domain Model prima o poi ci si scontrerà sicuramente con un aumentata complessità dei nostri modelli, cosa che ci porta ad avere domini troppo anemici per soddisfare la necessità di fare delle particolari query, oppure faticare molto nell’esprimere le query tramite il nostro ORM preferito. Il sintomo tipico è, iniziare a scervellarsi su una nuova query perché il modello non è adatto a soddisfare una nuova interrogazione che si rende necessaria perché è stata introdotta una nuova UI utente che deve mostrare XYZ all’utente. Uno dei problemi in questi scenari è LINQ, perchè se da una parte sembra la manna dal cielo, perchè permette di esprimere Query sul nostro modello, in realtà potrebbe essere considerato il male allo stato puro, perchè vi costringe a modellare il dominio affinché sia interrogabile. Il rischio insito di LINQ è quello infatti di avere domini fortemente anemici e che comunque debbono esporre molto del loro stato Affinché possano essere interrogati.

    Se vi ritrovate in questi problemi allora molto probabilmente CQRS fa per voi, vediamo quindi come poterlo implementare in maniera semplice, forse impropria, ma per ottenere dei vantaggi senza dover sconvolgere architetture precedenti.

    Se nel nostro programma usiamo ad esempio NHibernate per persistere i nostri oggetti di dominio o EF, è possibile fare delle semplici VIEW affinché sia possibile avere delle visualizzazione in sola lettura dei dati che interessano. Si fa una VIEW per ogni UI o in generale per ogni formato di dato che volete mostrare all’utente e questo permette di avere flessibilità di design nel proprio dominio, dato che non deve più essere usato per “leggere” dati. Potete ora mettere tutte le proprietà private, (tanto le letture vengono fatte con un datareader su una VIEW :)). Se usate un Db NoSql come RavenDb o Mongo potete sempre creare degli indici che vi permetteranno di avere visioni differenti sulle vostre entità. Dove non arrivate con una view potete usare una stored, la cosa importante è la separazione tra operazioni che modificano lo stato (fatte con il dominio) e lettura dei dati (fatte attraverso il QueryModel, ovvero viste e stored). I vantaggi di questo approccio sono

    • è semplice, non vi richiede di introdurre nulla di complesso
    • I QueryModel sono sempre sincroni, ovvero quando eseguite un comando subito tutti QueryModel sono aggiornati

    D’altra parte questa struttura non è completamente flessibile perché esiste un forte accoppiamento tra lo stato delle classi di dominio ed i QueryModel. Questo comporta che ogni volta che un oggetto di dominio viene rifattorizzato rischiate di riscrivere View e Stored che lo usano, però comunque le modifiche si fermerebbero li.

    Di base però questo approccio è comunque CQRS e vi porterà molti vantaggi, primo tra tutti la semplificazione del codice, dato che solamente le chiamate verso il WriteModel utilizzeranno ORM, Validatori, etc etc, mentre tutte le chiamate al QueryModel saranno molto semplici. Un vantaggio tra tutti? Praticamente la scomparsa dei Dto, se avete Sql Server, una volta create viste e stored potete tranquillamente usare un Dataset che vi fate generare dal designer ed utilizzare tutte le funzionalità di binding della vostra UI. Se usate NHibernate in un progetto WPF non avete più il problema di capire “quanto a lungo deve vivere una ISession” e i problemi del lazy load usato durante il binding, semplicemente la ISession viene usata solamente quando si esegue un Comando e vive per la durata dell’esecuzione del comando stesso, per tutto il resto potete leggere con una normale SqlConnection.

    Se poi un purista dice che questo non è CQRS, possiamo chiamarlo in altro modo, il concetto è che usare più modelli per soddisfare esigenze differenti (Oggetti per le modifiche e Viste e stored per le letture) è spesso un approccio vincente, poi lo possiamo chiamare come ci pare :).

    Gian Maria.

  • Siti online per iscriversi a SharePoint Future 2012 e SharePoint Conference 2013

    La data la sapevate già. Da ieri però, è online il sito, il che significa che potete finalmente iscrivervi alla prima conferenza in Italia sulla nuova versione di SharePoint: SharePoint Future 2012 . Come? Semplicemente utilizzando l'indirizzo: -...
  • Minimal Download Strategy in SharePoint 2013

    Una delle novità dell'interfaccia di SharePoint 2013 è il componente denominato "Minimal Download Strategy" (che da ora in poi chiameremo MDS). Questo componente è un vero e proprio framework di navigazione, che fa uso sia di tecnologie...
  • SharePoint 2013 preview software requirements: .NET Framework 4.5!

    E' sicuramente la prima novità per noi sviluppatori. (Per fortuna) SharePoint 2013 gira sopra il .NET Framework 4.5 , attualmente in versione RC e che verrà presto rilasciato assieme a Visual Studio 2012 e Windows 8. Lo potete vedere sia direttamente...
  • SharePoint 2013 preview is here!

    Ragazzi... ci siamo per davvero! Da oggi, assieme alla nuova versione di Office, è disponibile la prima preview della nuova versione di SharePoint, che avrà il nome di "SharePoint 2013". Potete scaricare le immagini della preview tramite i seguenti...
  • CQRS e i dati stale sono ovunque

    Quando inizi a lavorare in ottica CQRS, ma più in generale quando ammetti che tra l’esecuzione di un comando e l’aggiornamento dell’UI presentata all’utente possa passare del tempo per cui la UI non riflette immediatamente il risultato del comando, ti chiedi se questa “limitazione” sia “vendibile” e “accettabile”  dagli utenti ed in generale agli stakeholder del progetto.

    Molto spesso si parte prevenuti dicendo che non è ammissibile che un utente esegua l’operazione X e l’interfaccia rifletta l’effettivo risultato in ritardo, anche se solo dopo pochi secondi, oppure ancora peggio, che mostri i dati vecchi, ma è veramente cosi??? Durante il vostro normale utilizzo da Utenti software fate caso a quanti siti importanti utilizzano questo paradigma. Prendiamo E-bay; stamattina mi connetto, debbo lasciare due feedback, uno degli item è arrivato, quindi lascio il feedback solo su quello poi torno sul “il mio ebay” e … ho ancora due feedback da lasciare, vabbè, faccio un paio di ricerche, passano cinque minuti buoni, torno sul “il mio ebay” e la pagina è ancora cosi

    image

    A questo punto magari mi sorge il sospetto che il sistema prima non abbia accettato il feedback (nonostante mi abbia detto che era stato preso in carico) per cui clicco per lasciarlo ancora, ma il sistema mi notifica che qualche cosa non va.

    image

    In ottica DDD molto probabilmente la UI che visualizza “il mio ebay” non è stata ancora notificata dell’avvenuto feedback, per cui mi presenta ancora il link per farlo, chiaramente quando tento di farlo ancora e vado su una UI che probabilmente è pertinente del Bounded Context dei Feedback mi trovo che la UI è aggiornata e mostra chiaramente che l’operazione richiesta non è disponibiole. Probabilmente il denormalizzatore che gestisce “il mio ebay”, (il cui compito è attendere il DOMAIN EVENT FeedbackDone, ed in base ad esso aggiornare il numero di feedback che l’utente deve lasciare) ha priorità minore, forse il sito era carico, forse fisicamente il feedback ha richiesto tempo per essere eseguito, etc etc. Non mi interessano i dettagli, ma piuttosto che il sistema utilizzi chiaramente paradigmi CQRS e che mi stia mostrando dati vecchi (stale)

    Ora torniamo a quello che dicevo prima sul fatto che questa “limitazione” sia “vendibile” e “accettabile”. La prima considerazione è che questa non è una limitazione, anzi è una funzionalità che aumenta la scalabilità. Se mi soffermo a pensare perché “il mio ebay” mostri ancora 2 feedback mi viene da pensare che magari il sistema sia molto carico al momento, oppure magari la “tabella dei feedback” è in lock per un upgrade.. o chissà cosa, ma il mio feedback è stato preso comunque in carico dal sistema, anche se il resto del sistema non è stato notificato/aggiornato. Se volessi un sistema che non ammette la visualizzazione di dati stale, dovrei attendere durante il postback del feedback che tutte le UI siano aggiornate  e magari farlo in transazione, questo fa si che dopo 5 minuti ancora vedrei la pagina caricarsi perchè non riesce ad aggiornare “il mio ebay”? Oppure non posso lasciare feedback se per qualche ragione ho un lock nella tabella dei feedback per un upgrade: inaccettabile. Un sistema che non ammette di mostrare dati vecchi (se è in un picco di carico o in un upgrade oppure ha dei lock perchè in quel momento sta girando un processo o per qualsiasi ragione) è un sistema che prima o poi diventerà lento, l’utente premerà il bottone “lascia il feedback”, dopo 30 secondi ancora la pagina è in caricamento ed avremo un utente frustrato

    L’ammettere che le UI possano essere stale permette al sistema di rispondermi immediatamente dicendo “il tuo feedback è stato preso in carico”, punto. Il fatto che poi tutto il sistema Ebay si accorga di questo in ritardo per me non è importante, importa che il comando e la mia azione siano state prese in carico ed in modo molto veloce. Ragionare a Command / Handler in ottica CQRS rende il mio sistema molto scalabile e soprattutto molto User Task oriented. L’utente deve essere semplicemente “avvertito” di questo funzionamento, in modo che quando guarda i dati, è conscio che su qualcuno di essi si possa essere formata della muffa (dati stale).

    Appurato che questa struttura non è una “limitazione” ma semplicemente una struttura per aumentare la scalabilità ragioniamo sull’”accettabile” da parte degli utenti. Il mio consiglio è che prima di dire “non è accettabile” si faccia uno studio reale dei requisiti, per capire se è compatibile con i suddetti e soprattutto si intervistino gli utenti per capire come la pensano e come verrà usato il sistema. In un sistema su cui lavoro, il fatto di fare un upgrade in background ed essere notificati in differita sul risultato è stato una grande miglioria, perché il sistema era più responsivo. Il vedere per un po’ di secondi dati vecchi non era assolutamente un problema, ma invece di attendere 10 secondi per l’esecuzione di complesse operazioni di business su un dato, il sistema risponde in pochi millisecondi dicendo all’utente “ho inziato l’elaborazione” e l’utente viene avvertito in modo esplicito solamente in caso di fallimento (raro) perchè deve prendere azioni correttive. L’utente è più contento, accetta che il risultato sia visibile in differita, ed è più felice.

    Insomma, siamo nel 2012, e sempre più  i sistemi informatici attorno a noi sono realizzati su questi paradigmi ed ammettono che sia normale visualizzare dati vecchi e sempre più gli utenti saranno abituati a questo paradigma, e anzi, forse riterranno inaccettabile un sistema che blocca la UI per 4 secondi scrivendo “updating” commentando: “che schifo, perché non potrebbe fare sto lavoro in background e notificarmi in differita in caso di problemi?”, quindi probabilmente saranno le strutture “tradizionali” ad essere “inaccettabili” :).

    Meditate gente, meditate.

    Gian Maria

  • MS12-050 Security Patch per SharePoint 2010

    Ieri, 10 luglio 2012, Microsoft ha rilasciato la patch MS12-050 all'interno del suo bollettino, patch che risolve un possibile buco di sicurezza su SharePoint 2010. La patch verrà installata in automatico tramite gli aggiornamenti di Windows. Se voltete...
  • Microsoft SharePoint MVP per il terzo anno di fila

    Ci risiamo.. per me il primo luglio è ormai una data particolare. Che aspetto di anno in anno , con gioia, curiosità e un leggero terrore :) E' particolare perchè è dal primo luglio che parte, se qualcuno lo vuole, il mio anno da MVP su SharePoint...
  • SharePoint 2010, Real World Solutions - Slide

    Ciao a tutti! Per chi non è venuto lo scorso 27 giugno in Microsoft Italia, sono disponibili le slide dell'evento SharePoint 2010 Real World Solutions sul sito della community. Precisamente a questo indirizzo: - http://www.sharepointcommunity.it/documents...
Powered by Community Server (Commercial Edition), by Telligent Systems