BuildProvider, ExpressionBuilder e VirtualPathProvider

di Cristian Civera, in ASP.NET 2.0,


Questo articolo è tratto dal capitolo 14 (HttpRuntime e BuildProviders) del libro ASP.NET 2.0 per tutti di Daniele Bochicchio, Cristian Civera, Riccardo Golia e Stefano Mostarda.

Acquista la tua copia col 10% di sconto!

ASP.NET 2.0 è un motore, che sfrutta l'ambiente messo a disposizione dal .NET Framework, in grado di soddisfare qualunque richiesta proveniente dal WebServer. Non serve quindi solo richieste che si aspettano codice HTML, ma anche qualsiasi forma di testo o dato binario come immagini, documenti ecc. Conoscerne il funzionamento e tutti gli attori che agiscono nel processo di esecuzione di una richiesta, permette di apprendere meglio le funzioni specifiche delle pagine con estensione .aspx e di sfruttare il motore per tutte le esigenze che il mondo web può richiedere.

...omissis...

Generazione di codice con i BuildProviders

Nel paragrafo relativo all'HttpRuntime si è visto che nella fase di preparazione dell'applicazione, attivata alla prima richiesta, entrano in azione i BuildProviders. Questi sono generatori di codice ad alto livello (C#, VB, J#, ecc.) destinato poi ad essere compilato dal motore di ASP.NET 2.0. Lo scopo è quello di fornire degli assembly pronti ad essere eseguiti, sfruttando le capacità del .NET Framework, e di dare all'applicazione web una versatilità di elaborazione dei file che si possono inserire o togliere in qualsiasi momento.

Questi generatori sono oggetti che ereditano dalla classe astratta BuildProvider nel namespace System.Web.Compilation e lavorano in funzione dell'estensione che gli è stata associata. Un esempio è PageBuildProvider, legato all'estensione .aspx, e che è responsabile del funzionamento di parsing delle pagine visto nel capitolo 5. Caratteristiche come Themes, MasterPage, UserControls, Resources (per la localizzazione), Profile e WebService sono fornite mediante i BuildProviders che rendono di conseguenza ASP.NET 2.0 diverso da altri motori web (ASP, PHP, ecc), i quali interpretano ad ogni richiesta i file.

Come la maggior parte delle funzionalità, anche questi provider si configurano nel web.config indicando per ogni estensione il tipo da caricare (non è possibile usare un provider diverso anche per un unico path):


Esempio 14.10
<system.web>
  <compilation>
    <buildProviders>
      <add extension=".aspx"
        type="System.Web.Compilation.PageBuildProvider" />
    </buildProviders>
  </compilation>
</system.web>

I BuildProvider esistono in diverse tipologie, attribuite mediante BuildProviderAppliesToAttribute con il quale decorare la classe, e differiscono nel momento in cui vengono elaborati e nelle cartelle in cui operano. Sono:

  • Code: genera codice per i file presenti nella cartella speciale App_Code;
  • Resources: genera codice per i file (tipicamente di risorse) presenti nelle cartelle speciali App_GlobalResources e App_LocalResources;
  • Web: genera codice per tutti i file presenti nelle cartelle e sotto cartelle dell'applicazione web, ad eccezione di quelle speciali nominate in precedenza;
  • All: genera codice per tutti i file presenti nelle cartelle dell'applicazione web.

Il metodo principale della classe astratta BuildProvider è GenerateCode, nel quale si deve creare la rappresentazione del codice. Per farlo il .NET Framework contiene un modello ad oggetti all'interno del namespace System.CodeDOM, indipendente dal linguaggio, volto alla generazione di codice ad alto livello. In pratica si scrive codice per produrre dell'altro codice in un'unica forma sfruttando le medesime potenzialità dell'IL. Poiché tutti i linguaggi .NET, come C#, VB, J#, Delphi, ecc., devono fornire anche un generatore che, prese queste classi, produce codice nella loro sintassi, è facile sfruttare questo meccanismo all'interno di ASP.NET 2.0 tramite i BuildProvider.


Esempio 14.11 - VB
Dim mioTipo As New CodeTypeDeclaration("MiaClasse")
Dim mioMetodo As New CodeMemberMethod()
mioMetodo.Name = "MioMetodo"
mioMetoto.ReturnType = New CodeTypeReference(GetType(String))

Esempio 14.11 - C#
CodeTypeDeclaration mioTipo = new CodeTypeDeclaration("MiaClasse");
CodeMemberMethod mioMetodo = new CodeMemberMethod();
mioMetodo.Name = "MioMetodo";
mioMetoto.ReturnType = new CodeTypeReference(typeof(String));

Il codice precedente è un semplice esempio di uso di CodeDOM che, dato in pasto al VBCodeGenerator o al CSharpCodeGenerator, genera i seguenti testi:


Esempio 14.12 - VB
Public Class MiaClasse
  Public Function MioMetodo() As String
  End Function
End Class

Esempio 14.12 - C#
public class MiaClasse
{
  public String MioMetodo()
  {
  }
}

Il linguaggio con il quale è generato il codice è stabilito in generale nella sezione di configurazione system.web/compilation/@defaultLanguage e in specifico per ogni pagina, con l'attributo language della direttiva @Page o @Control.

3 pagine in totale: 1 2 3

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti