Qualche tempo fa parlai dell'implementazione dell'AutoEventWiredUp di ASP.NET sottolineando come riducesse moltissimo le performance e dell'oppurtunità di tenerlo sempre disattivato.
In ASP.NET 2 l'AutoEventWiredUp è ancora di default attivo e soprattutto Visual Studio 2005 a differenza di Visual Studio .NET 2003 lo tiene ancora attivo. Mi sono quindi spaventato e ho verificato cosa fa:
Quando impostiamo a false la proprietà viene emesso del codice nella pagina che sovrascrive TemplateControl.SupportAutoEvents. In funzione di questa variabile ad ogni esecuzione aggancia quindi gli eventi. La differenza sta nel fatto che tenta ancora di creare il delegate alla funzione tramite Delegate.CreateDelegate, ma ora alla funzione è possibile chiedere se generare o meno un'eccezione. Già questo migliora di molto le performance, inoltre mantiene un dictionary di MethodInfo (oggetti reflection) in cache così da non ripetere più l'operazione.
Per non pesare ancora sulla ricerca degli eventi alla quale agganciarsi in presenza di un metodo con il nome corretto, viene poi in aiuto il pattern degli eventi che sfrutta un dictionary nomevento (stringa) / delegate dell'evento. Il lavoro quindi dell'uso dell'AutoEventWiredUp si limita a sfogliare il dictionary contenente i metodi della nostra classe e il dictionary degli eventi.
Insomma, ora va molto meglio anche se personalmente continuerò con l'override dei metodi che scatenano gli eventi e la disattivazione della funzione.
Gli eventi che intercetti sono definiti nella pagina stessa dalla quale erediti.
Il pattern degli eventi usato nel framework prevedere che un evento "Evento1" abbia un metodo virtual protected "OnEvento1" così da permettere alle classi ereditanti di ridefinire il comportamento dell'evento.
Nelle pagine asp.net quindi per intercettare il load della pagina ti basta fare
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// tuo codice
}
Richiamando il base manterrai intatto l'evento Load originale e chi vuole dall'esterno (o anche dall'interno) intercettarlo.
E' solo un'altra soluzione e non dico che sia la migliore
Ciao, grazie x la risposta...nemmeno tu sei in ferie! ;-)
Il problema non è nel metodo dell'evento, ma nella dichiarazione dell'event handler che permette al metodo di essere eseguito. Se si toglie il flag AutoEventWireup, VisualStudio non ti crea più i delegate in automatico giusto? Quindi vuol dire che da qualche parte dovremo dire che sull'evento X nella nostra pagina deve essere chiamata la nostra funzione MiaPagina_EventoX. Mi chiedo quindi dove andrebbero messe queste dichiarazioni: nel costruttore della classe-pagina? In un metodo che viene sempre richiamato prima che scatti il primo evento? Se ricordi, in VS.NET 2003 queste dichiarazioni venivano messe in quel metodo InitializeComponent che l'editor di VS raccomandava di non toccare... Esiste un metodo simile anche in ASP.NET 2.0 ?
Ciao e grazie
Davide
Modificato da fradax il 13 agosto 2005 12.15 -
Infatti la soluzione che t'ho proposto non usa i delegate ma semplicemente sovrascrive i metodi della classe Page che scatenano i rispettivi eventi.
L'AutoEventWireUp non è una funzione di visual studio. In vs 2003 questo era disabilitato e quindi era necessario creare i delegate (autogenerati come dici te da vs). Con asp.net 2 e con vs 2005 il flag è a true di default e vs non genera più i delegate ma semplicemente genera i metodi
Page_OnEvento...
Quindi se metti a false devi ritornare alla tecnica di vs 2003. O intercetti con i delegate nel costruttore/init (in vs 2003 metteva tutto nell'init perché inseriva anche i delegate per gli eventi di controlli figli), oppure sfrutti la mia soluzione
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.






Stampa
Download



Ciao,
spero che mi risponderai dopo così tanto tempo dalla pubblicazione.
Hai scritto: "Insomma, ora va molto meglio anche se personalmente continuerò con l'override dei metodi che scatenano gli eventi e la disattivazione della funzione."
Cosa vuol dire che continuerai con l'override dei metodi che scatenano gli eventi? Se io disattivo la funzione di AutoEventWireUp metto la dichiarazione dei delegate degli eventi in una qualche funzione, per esempio supponiamo di avere una pagina che si chiama Login:
public Login() {
this.Load += new EventHandler(Login_Load); }
Ho usato il costruttore perchè, essendo a false il wireup, non sapevo in quale altro posto potessi aggiungere il delegate. Se infatti volessi scrivere del mio codice nell'evento PreInit dove potrei dichiarare il delegate???
Così facendo poi si risolve anche il problema dell'eventuale ereditarietà delle pagina non dalla classe System.Web.UI.Page ma da una pagina base "intermedia", una tecnica che si utilizza spesso in ASP.NET 1.1 per far sì che, per esempio, si esegua uno stesso codice sul load di tutte le pagine (spero di essere stato chiaro...).
Ciao e grazie
Davide
Modificato da fradax il 12 agosto 2005 15.21 -
Continua »»» | Rispondi »»»