.net comments edit

Per chi ha la fortuna di partecipare ai TechDays 2008 / WPC ed è interessato ad una sessione che mostra un caso reale di un applicazione scalabile con SOA, WCF, AOP e code Asincrone non può che non venire qui.

Insieme al Janky, stiamo ultimando il materiale e vi assicuro che di robe interessanti ce ne saranno molte e tutte realmente implementate in un progetto reale (MTV.it).

Ora non avete scuse per saltare il pranzo e venire alla nostra Lunch session :P.

Ciauz 

 

.net comments edit

Una delle cose scomode che si ha in un'applicazione service oriented è il deploy e i numerosi file di configurazione. Se penso alla nostra attuale struttura parliamo di circa 20 servizi e di altrettanti file di configurazione.

Molto spesso questi file di configurazione hanno parti in comune tra loro, tipo custom section, behaviors, ecc e ogni qual volta devi cambiare una di queste parti sei costretto a dover modificare decine di file di configurazione.
Per ovviare il problema mi sono venute in mente due soluzione (se ne avete altre sono ben accette :D):

  1. Mettere le configurazioni in comune su file di configurazione esterni;
  2. Creare un file di configurazione comune a tutti i servizi.

Diciamo che mi è piaciuta più la seconda opzione, minor numero di file da gestire e maggior difficoltà nel realizzare la cosa :D (per la serie le cose semplici non ci piacciono).

Detto ciò ne è uscita la seguente classe:

using System; 
using System.Configuration; 
using System.IO; 
using System.ServiceModel; 
using System.ServiceModel.Configuration; 
using System.Web.Hosting; 

public class MyServiceHost : ServiceHost 
{ 
    private string configPath; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="MyServiceHost"> class. 
    /// </see> 
    /// </summary> 
    /// <param name="serviceType" />Type of the service. 
    /// <param name="baseAddresses" />The base addresses. 
    public MyServiceHost(Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="MyServiceHost"> class. 
    /// </see> 
    /// <param name="singletonInstance" />The instance of the hosted service. 
    /// <param name="baseAddresses" />An <see cref="T:System.Array"> of type <see cref="T:System.Uri"> that contains the base addresses for the hosted service. 
    /// <exception cref="T:System.ArgumentNullException"> 
    ///     <paramref name="singletonInstance"> is null.</paramref> 
    public MyServiceHost(object singletonInstance, params Uri[] baseAddresses) 
        : base(singletonInstance, baseAddresses) 
    { 
    } 

    private string ConfigPath 
    { 
        get 
        { 
            if (configPath == null) 
            { 
                // Hostato in IIS 
                configPath = HostingEnvironment.ApplicationPhysicalPath; 

                if (String.IsNullOrEmpty(configPath)) 
                    //Non hostato da IIS 
                    configPath = Directory.GetCurrentDirectory(); 
            } 

            return configPath; 
        } 
    } 

    /// <summary> 
    /// Loads the service description information from the configuration file and applies it to the runtime being constructed. 
    /// </summary> 
    /// <exception cref="T:System.InvalidOperationException">The description of the service hosted is null.</exception> 
    protected override void ApplyConfiguration() 
    { 
        // generate the name of the custom configFile, from the service name: 
        string configFilename = Path.Combine(ConfigPath, 
                                             String.Format("{0}.config", Description.Name)); 

        if (!string.IsNullOrEmpty(configFilename) && File.Exists(configFilename)) 
            base.ApplyConfiguration(); 
        else 
            LoadConfigFromCustomLocation(@"C:\Temp\Services.config"); 
    } 


    /// <summary> 
    /// Load the config file from custom location. 
    /// </summary> 
    /// <param name="configFilename" />The config filename. 
    private void LoadConfigFromCustomLocation(string configFilename) 
    { 
        var filemap = new ExeConfigurationFileMap {ExeConfigFilename = configFilename}; 

        Configuration config = 
            ConfigurationManager.OpenMappedExeConfiguration 
                (filemap, 
                 ConfigurationUserLevel.None); 

        ServiceModelSectionGroup serviceModel = ServiceModelSectionGroup.GetSectionGroup(config); 

        if (serviceModel == null) 
            throw new ConfigurationErrorsException("There are a problem with the configuration file."); 

        bool loaded = false; 
        foreach (ServiceElement se in serviceModel.Services.Services) 
        { 
            if (!loaded) 
                if (se.Name == Description.ConfigurationName) 
                { 
                    LoadConfigurationSection(se); 
                    loaded = true; 
                } 
        } 
        if (!loaded) 
            throw new ArgumentException("ServiceElements not found in the configuration file."); 
    } 
}

Il modo di utilizzarlo rimane lo stesso:

ServiceHost service = new MtvServiceHost(typeof(EmailService)); 
service.Open();

Nel file Services.config possiamo configurare tutti i servizi di cui abbiamo bisogno, ma tutto il resto del file di configurazione è comune a tutti.
Cambiamo un custom behavior comune a tutti, lo facciamo in un unico posto in un unico file!

Per ora sembra funzionare :D

 

eventi comments edit

Dopo il primo giorno il secondo è stato sicuramente caratterizzato dalla presentazione di Windows 7 e Oslo.

Windows 7:
La presentazione del nuovo sistema operativo è stata suddivisa in due parti, la prima più orientata all'aspetto commerciale del prodotto (credo per necessità legate alla presenza della stampa alla conference), con la dimostrazione di alcune aggiunte grafiche tipo una nuova taskbar per raggruppare i programmi aperti, la JumpList che permette di personalizzare le informazioni e le azioni da associare ad ogni programma, il supporto per il multi touch e delle semplificazioni sulla connessione di device che secondo Microsoft stanno avendo un'importanza sempre maggiore nelle esigenze quotidiane.

Altra novità di rilievo è il fatto che in Microsoft hanno lavorato molto sulle performance cercando di ridurre le risorse richieste dal nuovo sistema operativo che sarà meno oneroso di Windows Vista.
Minor I/O su disco, minor utilizzo di RAM, tempi di startup parecchio ridotti e un miglioramento della gestione dei consumi.Una cosa che mi ha lasciato perplesso è il fatto che non sono stati forniti i numeri su questi miglioramenti, e da qui la domanda è nata la domanda,  "Ma quanta Ram in meno utilizza 10%, 20%?"

Inoltre troviamo la possibilità di decidere quanto è "invadente" la UAC nel notificare all'utente le informazioni.

Per la parte un po' più tecnica troviamo delle novità molto interessanti come delle nuove API per lo sviluppatore che ci permettono di utilizzare i Ribbon, JumbList, Libraries sia con codice unmanaged (Win32) che managed e l'aggiunta di controlli come DataGrid, DatePicker, Calendar, Ribbon e VisualStateManager.

Molto interessante la parte sulla virtualizzazione, ossia e il supporto nativo per i VHD e la possibilità di fare il boot sulla macchina virtuale ed supporto al multimonitor sotto Termina Server.

Visual Studio 2010:
Avrà tutto l'editor (sia codice che visuale) in WPF e sarà integrato il designer di WPF e Silverlight direttamente dentro Visual Studio. Non ho altre novità in quanto non ho seguito le sessione su VS.

Office 14 (è un codename):
Supporto per l'utilizzo direttamente online con Internet Explorer e Firefox realizzato con Silverlight e AJAX, ma la cosa più interessante è stata la gestione dell'accesso simultaneo allo stesso documento, veramente molto impressionate.

Velocity:
Ieri è stata rilasciata la seconda CTP di questo tool per la cache distribuita. Tra le caratteristiche più interessanti sicuramente la possibilità di effettuare ricerche degli oggetti tarmite Linq (IQueryable<T>) su metadati/tag (almeno così immagino) e la possibilità di effettuare i Lock su oggetti.
La cosa che più mi ha colpito e mi lascia un po' perplesso è che l'engine di Velocity è basato su Windows Comunication Foundation, quindi la domanda è: Quanto è veloce questo velocity? :D

WCF e le Performance:
Ovviamente non potevo mancare alla sessione sulle performance di WCF dove un preparatissimo speaker a illustrato le problematiche sulle performance legate a questa tecnologia spiegando che non c'è un metodo per aumentare le performance, ma che queste si posso raggiungere configurando al meglio tutti i parametri come per esempio il buffersize, ecc (se li elenco tutti viene fuori un tema :D).

Purtroppo non c'è una tabella con dei valori di riferimento in quanto questi variano da esigenza e tipo di lavoro a cui un servizio WCF è sottoposto quindi il giusto bilanciamento va trovato con il tempo.

Fortunatamente ho avuto modo di parlare con il Team di WCF, e mi hanno annunciato che stanno lavorando su una versione stile Wizard (era ora!!) del configuratore di WCF e che, come già segnalato da me, nella loro roadmap è previsto un tool che analizza il trace di WCF per tirare fuori i parametri ottimali da configurare per ottimizzare le perfomance (anche questa una grande conquista). Purtroppo per entrambi i tool non mi hanno potuto comunicare quando potremmo utilizzarli, ma la notizia positiva è che sul primo ci stanno già lavorando ;).

EntityFramework 2.0:
Con un grande boato, stile roma alla conquista di cartagine, è stata presentata la Persistance Ignorance (era ora ****), a seguire il Lazy Loading (buahahahaha, boato anche qui).
Altra caratteristica importate è la possibilità di lavorare ed effettuare il mapping partendo dal dominio e non più dal database (ovviamente rimane possibile fare il contrario).
Altra novità è la possibilità di intervenire nel Workflow, aprendo così grandi scenari.
Nel complesso mi sembra molto migliorato e fa capire che il Team sta lavorando molto per cercare di recuperare strada verso NH. Dire che con questa release lo raggiunga o si avvicini è presto per dirlo, però sicuramente sta prendendo la giusta direzione.

Oslo:
Il mistero della conference (anche dopo averla vista :D). Purtroppo non è ben chiaro, almeno dopo le prime sessioni, di cosa sia oslo e dove può arrivare, ma sicuramente è un progetto in cui Microsft crede molto e punta molto, basta vedere le prime 3 slide (purtroppo non ho le foto per postarle) e si capisce subito che abbraccia diverse tecnologie di casa MS, WCF, ASP.NET, EF, ecc
Cercare di spiegare cosa è Oslo è veramente difficile e comincio rubando una slide a raf :D

 

 

  • La parola chiave è la "M", durante la sessione hanno giocato parecchio sulla parola Model, altro non è che nome del nuovo linguaggio di modellazione, necessario ad definire modelli e utilizzo di DSL;
  • "Quadrant" è il nuovo tool (anche questo in WPF) con cui andremo a modellare sia in maniera visuale che testuale;
  • ha un "Repository" per i modelli che attualmente è su SQL Server ma può essere qualsiasi cosa; - i runtime prendono i modelli e li utilizzano (Dublin, ASP.NET, WF, WCF, EF, SQL, Windows);

Riassunto in due righe (purtroppo non abbiamo abbastanza informazioni) Oslo ci dovrebbe offrire la possibilità di creare un dominio tramite un linguaggio universale ("M") ed applicarlo alle varie tecnologie.

La cosa che mi ha lasciato perplesso è che c'è ancora parecchio mistero intorno a Oslo, chiedendo alle persone presenti alla sessione, molte hanno interpretato diversamente la cosa, il che si traduce in molta confusione.
Dalle sessioni si è potuto notare che c'è ancora parecchio da lavorare, lo prova il fatto che la demo di Don Box non ha funzionato (lui ovviamente con il suo solito stile ne è uscito alla grande) ed il fatto che non è possibile utilizzare repository differenti a SQL e creade domini complessi. Insomma un work in progress.

A domani per il Day 3 ;)

 

eventi comments edit

Finalmente è iniziata la PDC (Professional Developers Conference) a Los Angeles.

AZURE:
La giornata si è aperta con l'annuncio di Microsoft Windows Azure da parte di Ray Ozzie. Un insieme di Servizi (Windows Live, Dynamics CRM, Sharepoint Online, SQL Server Services e .NET Services) "hostati" su Datacenter Microsoft sparsi in tutto il mondo.

Tutto questo non fa che cofermare l'idea che Microsoft sta puntanto sempre più su un'ottica di Software Plus Service.

Ovviamente una cosa del genere può aprire riflessioni su svariati settori, dal costo finale (dato che si parla di hosting), target di utilizzo e capire come il mercato accolga l'idea che alcune informazioni possano non risiedere sui propri server, sincronizzazione tra i vari datacenter, ecc.

C# 4.0:
La novità successiva è la presentazione del C# 4.0 che abbraccia a 360° il DRL (Dynamic Runtime Languages) a dimostrazione dell'interesse di Microsft verso i linguaggi dinamici, aggiunge la possibilità di assegnare valori di default ai parametri dei metodi facilitando così la possibilità di creare overload riducendo parecchio codice nelle nostre classi.
Altra caratteristica interessante è sicuramente il fatto che il "Compiler as a Service", ossia ci viene offerta la possibilità di iniettare codice C# a runtime senza utilizzo della reflection ma passando una semplice stringa con il codice all'interno.
Ultima novità di rilievo è la covarianza spiegata da Cristian qui.

.NET Type System:
Sia dalla sessione sul C# 4.0 che da quella sul .NET Type System mi è parso di capire che si è lavorato parecchio anche nell'ottica COM, con novità molto interessanti sul deploy di applicazioni che fanno uso di componenti Interop di differenti versioni.

ASP.NET MVC:
Su MVC resto dell'idea che è un grande prodotto e lo è stato dimostrato. Purtroppo non è stato possibile vedere delle novità su questo framework data la sua imminente uscita.

Domani ci aspetta la presentazione da parte di Dox Box su oslo, a presto news ;)

Ciauz

 

.net comments edit

È il suo limite, non è possile aggiungere un'altra folder.

Voi gistamente direte, per quale motivo dovreste creare così tante folder in un'unica folder.
La risposta è perchè sono strunz :D.

In realtà c'era un motivo valido, il problema è che non ci aspettevamo un numero così alto di partecipanti ad quel progetto.

Vabbè nulla che non si possa risolvere, una suddivisione per lettere stile Excel e il problema non si pone.

Ciauz

 

.net comments edit

Ai Community Days, con Stefano durante la sessione "Creare applicazioni web service-based con .NET 3.5" abbiamo parlato di Message Queue, ma subito dopo ci è stato chiesto il perchè andare ad utilizzare Message Queue in alternativa ai Service Broker di SQL Server.

La decisione non è affatto facile in quanto ognuno dei due ha dei punti a favore nei confronti dell'altro.

Per prima cosa c'è da dire che MSMQ è integrato con il sistema operativo fin dai tempi di Windows 95, caratteristica non da poco in quanto non richiede costi di licenza aggiuntiva a differenza dei Service Broker che richiedono una licenza di SQL Server.
Altra caratteristica che gioca a favore di MSMQ è l'integrazione a costo zero con WCF, infatti quest'ultimo ha già un transport channel per MSMQ, cosa non presente per i Service Broker (qui nasce la domanda, perchè?).

Cambiando sponda con Service Broker si ha il vantaggio del repository, che è il database di Sql Server e questo ci permette di evitare transazioni distribuite consentendoci maggiore performance.

Sicuramente per la parte di sviluppo applicativo MSMQ la vince sui Service Broker, in quanto bastano poche righe di codice WCF per poter cominciare subito ad utilizzarlo, e questa non è una caratteristica da poco, ma non si può dire se è meglio uno o l'altro, la scelta va ponderata in base alla propria esigenza.

Ciauz

 

eventi comments edit

È un po di tempo che non mi si sente sul blog, ma sono tornato a scrivere un post per ringraziare Stefano e Daniele per avermi dato la possibilità di tenere una sessione (la mia prima) ai Community Days.

Poter spiegare parte della mia esperienza in MTV mi ha fatto molto piacere, e poi, chi mi conosce, sa quanto sono innamorato di WCF e che starei sempre lì a parlarne :).
Devo dire che è stata un'emozione unica, difficilmente ripetibile, che ancora oggi faccio fatica a realizzare nella mente.
Ovviamente ringrazio tutti i ragazzi dello staff di aspitalia e ugidotnet insieme a tutte le persone presenti alla sessione con cui ho avuto il piacere di parlare e discutere sul materiale trattato.

Infine volevo dedicare questo mio traguardo professionale ad una persona a me molto cara che ora non c'è più ma che resterà per sempre nella mia vita e che sicuramente sarebbe stata fiera di me.

Byez

 

.net comments edit

Su suggerimento dello Sciuro Sudano ho dato un'occhiata a Managed Services Engine che in ambienti tipo quello descritto in questo post, in cui si ha un alto numero di endpoint può essere una manna dal cielo.

Per chi non lo conoscesse già, MSE (scaricabile da CodePlex), non è altro che un repository di servizi con il compito di fare da routing di tutti i client verso i vari servizi sparsi nella rete.

Si provi ad immaginare di dover cambiare indirizzo ad un servizio referenziato da 40 client? Sarebbe di difficile e di scomoda gestione, almeno 40 cambi configurazione e 40 riavvii dei vari applicativi.

Con MSE vi basta far puntare il vostro client al servizio che a sua volta ridirigerà le chiamate al servizio corretto, così nel caso si decida di cambiare un endopoint, una porta, o quel che volete, vi basta farlo solo su MSE, e non su tutti i client, poi come per incanto i 40 cambi di configurazione si traducono in un'unica operazione!

Beh mica male direi.

A tutto ciò va aggiunto il fatto che questo tool è dotato di un'ottimo wizard che segue l'utente durante la configurazione dei vari endpoint.

Ovviamente gli endpoint supportati da wcf li abbiamo tutti come mostrato dallo screenshot seguente:


 

ma si ha la possibilità di definirne dei propri.

Per la memorizzazione delle varie configurazione si appoggia a SQL Server, ma la creazione delle varie tabelle necessarie al suo funzionamento è del tutto automatizzata dal suo setup (cosa non sempre scontata in progetti open source)

Sono rimasto così impressionato dall'efficacia e utilità di questo tool che mi sembrava giusto parlarne.

Una grazie allo Sciuro Sudano per la dritta.

Ciauz

 

.net comments edit

In quest'ultimo periodo, in azienda, stiamo organizzando e progettando delle nuove parti di un'applicativo fortemente basato su servizi.

In questo e in molti altri scenari, si ha la necessità di avere una forte scalabilità e la certezza di non perdere nessun dato anche nel caso uno dei servizi si offline per manutenzione e/o problemi tecnici di qualsiasi tipo.

Dopo varie analisi con lo sciur Sudano aka Janky (spinto dalle teorie di Pat Helland :D, altro che notepad) abbiamo deciso di implementare per i punti crifiti dell'applicativo Microsoft Message Queue con WCF> e, devo dar atto che le suo potenzialità e casi di utilizzo sono veramente impressionati.

Basti pensare che in tutte quelle situazioni in cui si ha la necessità di avere chiamate OneWay verso un servizio, MSMQ può essere utilissimo.

Non voglio dilungarmi in particolari scenari e specifiche troppo tecniche, magari ne esce un qualcosa di scritto successivamente.

A chiunque sia interessato sull'argomento consiglio la lettura e visione di questo articolo/screencast http://code.msdn.microsoft.com/msmqpluswcf <a title="http://blogs.msdn.com/pathelland/"

Quindi come dice il caro Mostardone nazionale stay tuned

Ciauz a tutti.

P.S: il gatto è sotto l'auto e il lupo guarda lontano.