mercoledì 20 febbraio 2008

Dopo un piccolo periodo di assenza ho deciso di postare alcune parti di codice per la realizzazione di una WebPartChrome custom (anche in seguito alla richiesta da parte di un lettore del blog ).

Nel mio caso ho dovuto realizzare delle webparts con un look&feel completamente custom e questo porta alla necessità di realizzare un WebPartChrome, il quale si occupa del rendering vero e proprio.

Quindi realizziamo la nostra classe MyWebPartChrome che eredita direttamente da WebPartChrome e andiamo a fare l'override del metodo RenderWebPart :

public class MyWebPartChrome : WebPartChrome
{
   ....
   public override void RenderWebPart(HtmlTextWriter writer, WebPart webPart)
   {
      RenderWebPartHeader(writer, webPart)
      RenderPartContents(writer, webPart);
      RenderWebPartFooter(writer, webPart);
   }
   ....
}

Dove i tre metodi richiamati all'interno sono due metodi privati che si occupano di renderizzare parti distinte delle mie web parts (header e footer) e il metodo standard della WebPartChrome per la renderizzazione del contenuto. Per semplifcare ulteriormente la creazione del mio look&feel ho deciso di utilizzare dei templates, ovvero un file HTML che contiene dei semplici segnaposto dove andare a sostituire le parti necessarie per il corretto funzionamento del framework delle webparts (cosa su tutte l'ID del Title, che come accennavo nell'altro post, permette il corretto funzionamento del drag&drop). Avremmo quindi un template di questo tipo :

<div id="[IDWebPart]" class="miaclass1">
    <div id="[IDTitolo]" class="miaclass2">
        [Titolo]</div>
    <div class="miaclass3">
        [Verbi]       
    </div>
</div>
<div> 
    <div class="miaclass4">
  <div style="[Visibilita]">
   [Contenuto]
  </div>
    </div>
    <div class="miaclass5">
    </div>
</div>
<div class="miaclass6">
</div>

Una volta realizzato il mio template sarà compito del mio CustomChrome (o di altro) andare a leggersi il file direttamente da filesystem (con eventuale verifica di data modifica) o come risorsa incorporata. Questo esempio di template viene spezzato in Header e Footer tramite il segnaposto [Contenuto], che indica dove verrà renderizzato il contenuto della web part vera e propria:

....
webPartTemplate = MyTemplateBuilder.Split(new string[] { "[Contenuto]" }, StringSplitOptions.RemoveEmptyEntries);
WEBPART_TEMPLATE_HEADER = webPartTemplate[0];
WEBPART_TEMPLATE_FOOTER = webPartTemplate[1];
....

A questo punto ecco i metodi che renderizzano Header e Footer:

private void RenderWebPartHeader(HtmlTextWriter writer, WebPart webPart)
{
   writer.Write(WEBPART_TEMPLATE_HEADER
      .Replace("[IDWebPart]", GetWebPartChromeClientID(webPart))
      .Replace("[Icona]", webPart.ResolveUrl(webPart.TitleIconImageUrl))
      .Replace("[IDTitolo]", GetWebPartTitleClientID(webPart))
      .Replace("[Titolo]", webPart.Title)
      .Replace("[Verbi]", RenderVerbs(webPart))
      .Replace("[Visibilita]", (webPart.ChromeState == PartChromeState.Minimized)?"display:none;":"")
   );
}

private void RenderWebPartFooter(HtmlTextWriter writer, WebPart webPart)
{
   writer.Write(WEBPART_TEMPLATE_FOOTER);
}

Spero che questo piccolo post possa essere utile per la realizzazione di un Chrome completamente custom, operazione che a mio parere risultà un pò più macchinosa di quanto mi aspettassi, soprattutto data la fatica nella ricerca di materiale e di esempi funzionanti.

PS: ovviamente questo è un esempio scritto di getto e con un pò di taglia/incolla dal progetto che ho realizzato, quindi prendetelo giusto come piccola traccia

sabato 22 dicembre 2007

Eccomi finalmente qui a postare, dopo un lungo periodo in cui sto partecipando allo sviluppo di un grosso progetto ASP.NET.

Proprio in questo lavoro abbiamo applicato in maniera molto "decisa" il pattern MVP. Abbiamo deciso di utilizzarlo per diversi motivi e i risultati sono stati decisamente ben oltre le mie aspettative :

  • Testabilità dell'applicativo web (sicuramente questa è la prima condizione fondamentale per spingersi verso questo approccio e fin qui nulla di nuovo :)
  • Organizzazione del codice e "pulizia" decisamente soddisfacente
  • Con un pò di attenzione è stato abbattuto drasticamente il ViewState (questo non è sicuramente legato direttamente all'implementazione dell'MVP)
  • Essendo un grosso portale nel quale vengono utilizzate le Web Parts di ASPNET, è capitato di avere gli stessi "contenuti" renderizzati in maniera differente (quindi con usercontrols diversi). Qui l'MVP ci è stato di grosso aiuto, in quanto non solo può essere utilizzato per creare applicativi indipentendi dalla rappresentazione (web/winform), ma anche per creare "viste" diverse dello stesso presenter sempre in ambito web, ottenendo così in alcuni casi un risparmio di scrittura del codice superiore al 60%.

Beh che dire...nel mio caso l'esperimento è stato decisamente positivo!

Ecco alcuni link che potrebbero tornare utili (oltre ovviamente al caro e buon vecchio NSK :)

 

domenica 18 novembre 2007

In questi giorni sto lavorando su un grosso portale e sto utilizzando (come ormai faccio da un pò di tempo) l'accoppiata DDD/NHibernate e il mapping di NHibernate permette con semplicità di gestire tutte le casistiche che finora ho riscontrato senza nessuna problematica (con mia grande soddisfazione :).

Mi sono trovato però di fronte ad un piccolo problema : normalmente utilizzo le Criteria API per effettuare le mie interrogazioni (per ridurre al minimo gli errori legati alla digitazione delle stringhe hql e per facilitarmi la creazione di interrogazioni dinamiche) ma ho notato come non sia possibile effettuare una join su una collezione di "component" tramite Criteria (messaggio di errore : "collection was not an association") mentre tramite hql il tutto funziona come da "manuale".

Quindi avendo una entity A con una collection di value objects B non sarà possibile creare un Criteria e un successivo Alias/Criteria per effetuare filtri sulle proprietà di B.

lunedì 22 ottobre 2007

Devo ammettere che Mono è sempre stato un "argomento" che ha esercitato su di me un certo fascino....avevo fatto alcune prove in epoca decisamente "remota" e, successivamente, abbandonato la strada, mantenendo sempre un occhio verso lo sviluppo del progetto....

Eccomi ora reduce dai Mono Days, che come ha commentato Simone Chiaretta,hanno avuto un taglio sicuramente non tecnico, ma la mia intenzione era quella di farmi un'idea sulla "maturità" raggiunta dal progetto per poter iniziare nuovamente a fare un pò di sperimentazione (tra l'altro abbiamo messo in "cantiere" un progetto che realizzeremo proprio su Mono, così da poter valutare la piattaforma con più tranquillità). Fin qui tutto "regolare"...almeno fino a questa mattina, quando ricevo una telefonata di Novell (conseguenza della presenza all'evento) che mi propone la possibilità di prendere contatti/incontrare i loro sviluppatori per chiarire dubbi o difficoltà su Mono(ho riassunto un pò, ma il senso della telefonata è questo).....mica male!!!

Sembra che Novell stia decisamente premendo sull'acceleratore per spingere sempre di più l'adozione della "loro piattaforma ufficiale".....e dal mio punto di vista...non posso che esserne contento :)

lunedì 8 ottobre 2007

Scrivo questo post dopo un periodo di meditazione e tutto sommatto lo considero una mia riflessione a voce alta...

Mi è capitato in uno o più applicativi di avere oggetti del mio Domain Layer  provenienti da sorgenti dati differenti, che siano database diversi, web services o magari ldap. Ho sempre cercato di fare in modo di allineare il tutto e di nascondere tramite provider la diversa sorgente (premetto che anche l'utilizzo di NHibernate è "nascondo" tramite providers) facendo un bel pò di lavoro ripetitivo....ma a questo punto mi sorge un bell'interrogativo...visto che probabilmente mi è capitato e mi capiterà ancora...se cercassi di "standardizzare" il tutto? Non intendo fare un ORM o roba simile (ne esiste già uno che fa il suo sporco e ottimo lavoro eh eh eh), ma solo una serie di facilitazioni per agevolare la gestione di diverse sorgenti dati, nel modo più trasparente possibile....e ovviamente condividere il tutto su codeplex...

Per ora sono solo alcune idee ma ho voluto postare comunque per condividere il mio pensiero....con alcuni di voi l'ho già fatto in diverse sedi (di persona, via mail o msn) ma mi piacerebbe avere qualche suggestione/idea o anche critiche...

Ciauz!!

P.S. per Janky : ho meditato sul tuo consiglio di realizzare un persister custom per NHibernate e sicuramente per il progetto che sto realizzando ora è la soluzione migliore (quindi poi preparerò un bell'articoletto come promesso ;)...però mi piacerebbe comunque portare avanti anche l'altra idea...magari a tempo perso...

giovedì 4 ottobre 2007

In questi giorni stavo effettuando alcune prove sulle WebParts di ASPNET, vista la necessità di realizzare un portale "my.msn-like" per un nostro cliente.

Armato del libro "ASP.NET 2.0 WebParts In Action" (e dopo un attenta lettura, visto che partivo praticamente da zero) ho iniziato le mie prove e dopo diversi esperimenti sono arrivato alla realizzazione di una WebPartChrome custom per personalizzare il look&feel delle mie WebParts...ma appena sono entrato in modalità "Design" mi sono accorto di un "piccolo" bug...non funzionava il DRAG&DROP!!

Cercando così tra i vari forum/blog ho trovato il problema : nel libro trascurano un elemento fondamentale, quando si scrive il markup del titolo della WebPart è necessario aggiungere l'ID dello stesso generato con del codice simile a questo:

writer.AddAttribute(HtmlTextWriterAttribute.Id, this.GetWebPartTitleClientID(webPart));

E' quindi fondamentale la chiamata al metodo "GetWebPartTitleclientID". Questo è il link dell'articolo che mi ha permesso di individuare il problema :)

mercoledì 3 ottobre 2007

Eccomi dopo due intensissimi giorni di corso su architetture enterprise del buon Janky (ora finalmente e GIUSTAMENTE MVP :)

Devo dire molto sinceramente che è andato ben oltre le mie aspettative, molto meno codice rispetto al mastering di NHibernate (che ho seguito sempre con lui) ma molta molta "teoria" e possibilità di apprendere molti aspetti interessanti del "mondo architetturale" grazie agli esempi di un vero esperto in materia!! Si è parlato di SOA (e non solo di WCF, anzi!!), di AOP (cosa che mi ha sempre incuriosito ma non ho mai approfondito in maniera decisa e di cui finalmente ho intravisto le potenzialità!!!), di Spring.NET e ovviamente di Domain Model etc etc etc :)

Ora avrò un bel pò da meditare su tutto quello che ho visto e che spero di mettere in pratica il prima possibile (probabilmente la prima vittima sarà Spring.NET, che ho già utilizzato in un progetto come IoC container).....

Alla prossima :)

domenica 15 luglio 2007

Eccomi reduce da 26 ore senza dormire per il "pellegrinaggio" al maxi-concerto dei Genesis di Roma.....

  • Sveglia alle 5 di sabato mattina per raccogliere amici e via verso l'areoporto (partendo da ovest di Milano)
  • Partenza da Bergamo ore 8.25
  • Conquista di una posizione all'ombra all'interno del circo massimo alle 13
  • Attesa interminabile di 8 ore
  • Ore 21...inizia!!!
  • Nottata in giro per Roma (veramente una città stupenda!)
  • Ritorno a "casa" con volo alle 6.50...

Premetto che sono un fan accanito di Peter Gabriel e dei Genesis "progressive"...ma quello a cui ho assistito è stato veramente unico...e per una volta tanto potrò dire : io ero lì!!!

 

giovedì 28 giugno 2007

Ecco il mio primo post dopo tanto...ma tanto tempo :)

Sono reduce da una 5 giorni di fuoco, ma soprattutto dai community days della scorsa settimana. Devo dire che è da poco che bazzico nell'ambiente di ugidotnet...
ma anche questa volta sono rimasto molto colpito dal livello delle sessioni...
le ho trovate molto interessanti e mai scontate (cito a titolo personale quelle di janky, sia quella più architetturale che quella su "Linghiu" 2 SQL, quelle di Andrea e di Dino).
Davvero moltissimi spunti sui quali riflettere e per "migliorare" decisamente quello che è il mio approccio allo sviluppo/architettura.

Ora non mi resta altro da fare che iniziare a sperimentare un pò e nel frattempo, per quello che riguarda ORM e affini, continuare ad affidarmi ad NHibernate :)

sabato 18 novembre 2006

Ciao a tutti, questo è il mio primo post su questo blog (spero il primo di una lunga serie eh eh eh). Cercherò di raccogliere il più possibile idee, "scoperte", soluzioni e tutto ciò che trovo interessante o che che mi ha portato via parecchio tempo, in modo da condividere con tutti anche le più piccole cose.....e chissà, magari il tempo perso da uno verrà risparmiato da altri :) Andrea!