Mapping degli adattatori

Un adattatore consente di definire un insieme specifico di caratteristiche per un particolare dispositivo richiedente. Si supponga di essere un OEM che sta progettando un nuovo dispositivo basato sul progetto Palm Pilot di un palmare e di voler apportare modifiche e miglioramenti all'hardware. Per sviluppare un'applicazione Web Form mobile ASP.NET per il nuovo dispositivo, è necessario avvalersi di un adattatore di dispositivo personalizzato che consenta di sfruttare a pieno l'insieme di funzionalità dell'hardware potenziato.

Nel file Web.config, è necessario mappare ogni controllo mobile all'adattatore personalizzato creato per esso. Non solo si possono indicare singoli set di adattatori di dispositivo per una personalizzazione specifica del dispositivo ma è possibile eseguire un'ulteriore personalizzazione ereditando un set di adattatori di dispositivo da un altro set e personalizzando quindi il comportamento di determinate combinazioni di controlli/ dispositivi.

Operazioni all'interno di Web.config

Per mappare i controlli mobili e gli adattatori di dispositivo, occorre configurarli in modo dichiarativo nella sezione <mobileControls> dell'elemento <system.web>. Queste operazioni possono essere eseguite nel file Web.config, per le modifiche da isolare all'applicazione specifica, o nel file machine.config, per le modifiche che interessano l'intero computer. Le impostazioni che incidono su tutto il computer si trovano nel file machine.config per l'installazione di .NET Framework in %WINDIR% (la directory Microsoft Windows). In questa posizione, è possibile specificare i singoli set di adattatori che verranno scelti in fase di esecuzione.

Nota   Se non è presente alcuna sezione <mobileControls> nel file Web.config, è possibile aggiungerne una qualunque delle altre sezioni già presenti nell'elemento <system.web>.

In un file Web.config tipico è contenuta una sezione <configuration>, che a sua volta contiene le seguenti sezioni:

  • <system.web>. In questa sezione vengono impostate le informazioni di compilazione per il debug e i messaggi di errore personalizzati, nonché la modalità di autenticazione, la registrazione analisi a livello di applicazione, le impostazioni relative allo stato delle sessioni, le autorizzazioni per il download dei file e la globalizzazione a livello di applicazione. Inoltre, nel file sono specificati i filtri di dispositivo.
  • <appSettings>. Vengono specificate le configurazioni per le impostazioni relative alle proprietà dell'applicazione utente.

Dichiarazione di un set di adattatori

Un set di adattatori di dispositivo è essenzialmente il meccanismo di mapping interno al file web.config. Per ogni controllo che utilizzi un adattatore di dispositivo personalizzato, è necessario includere le informazioni riportate di seguito nel set di adattatori di dispositivo: una classe di predicati, un metodo di predicato, un adattatore di pagina, il nome del controllo e l'adattatore di dispositivo associato.

Per aggiungere un set di adattatori di dispositivo al file Web.config dell'applicazione, è necessario dichiararlo utilizzando un elemento <device> nella sezione <mobileControls> del file, come illustrato nell'esempio che segue.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
   <system.web>
      <!-- Other settings previously specified reside here. -->
      <mobileControls>
         <device name="myDeviceAdapter"
            predicateClass="fullyQualifiedAdapterClass"
            predicateMethod="specificMethodToInvoke"
            pageAdapter="fullyQualifiedPageAdapter">

            <control name="fullyQualifiedControl"
               adapter="fullyQualifiedPageAdapter"/>

            <!-- Add additional control names here. -->

         </device>
      </mobileControls>
   </system.web>
</configuration>

Definizione degli attributi di dispositivo

Come illustrato nel codice precedente, è necessario includere gli attributi riportati di seguito in ogni set di adattatori:

  • name
    Attributo che identifica in modo univoco il set di adattatori di dispositivo.
  • inheritsFrom
    Attributo opzionale che indica che il set di adattatori di dispositivo corrente eredita da un altro set, identificato dal nome specificato. Il set di adattatori di dispositivo padre può risiedere in qualsiasi punto della stessa sezione <mobileControls> del file Web.config in questione o in un file Web.config padre.
  • predicateClass e predicateMethod
    Attributi che puntano a un metodo statico chiamato per valutare se il set di adattatori è appropriato al dispositivo corrente. Il metodo accetta un solo parametro di tipo HttpContext e restituisce un valore booleano che indica se il set di adattatori è applicabile. Può, inoltre, esaminare le funzionalità del dispositivo di destinazione utilizzando la proprietà Browser dell'oggetto HttpContext fornito, che restituisce un oggetto MobileCapabilities.
  • pageAdapter
    Attributo che identifica la classe degli adattatori di pagina per il set di dispositivi, un tipo che implementa l'interfaccia IPageAdapter.

Se in una sezione <device> è incluso l'attributo inheritsFrom, non è necessario dichiarare gli attributi predicateClass, predicateMethod o pageAdapter. Il set di adattatori di dispositivo è in grado di ereditare questi attributi dalla definizione del set di adattatori di dispositivo padre.

Nota   Sebbene tali attributi non siano necessari, è possibile definirli se l'operazione è utile per l'applicazione.

In un set di adattatori è possibile inserire qualsiasi numero di sezioni o elementi <control>, ciascuno dei quali deve mappare un adattatore del controllo specifico (una classe che implementa IControlAdapter). Un elemento <control> ha due attributi: un attributo name che specifica la classe del controllo da mappare e un attributo adapter che specifica la classe dell'adattatore del controllo.

Considerazioni sul mapping

Sebbene tra un controllo e un adattatore esista un mapping uno a uno non è necessario scrivere una classe di adattatori del controllo univoca per ogni combinazione di controllo/ dispositivo. In generale, se un nuovo controllo mobile utilizza l'ereditarietà o la composizione semplice e non richiedere un output personalizzato, non richiede un adattatore del controllo. Prendere in considerazione le seguenti alternative:

  • Un adattatore o un set di adattatori potrebbe applicarsi a un tipo generico di dispositivo. Per tutti i dispositivi HTML 3.2 potrebbe, ad esempio, essere previsto lo stesso set di adattatori di dispositivo. Tuttavia, per alcuni controlli, potrebbero essere necessari adattatori di dispositivo più specialistici per dispositivi più specifiche; ad esempio, può essere opportuno scrivere un adattatore di dispositivo del controllo Calendar specifico per Pocket PC.
  • Un adattatore del controllo può essere associato a una classe base di controlli, invece che a singoli controlli. Un solo adattatore può, ad esempio, essere sufficiente a eseguire il rendering di tutti i controlli di convalida che ereditano dalla classe BaseValidator.
  • È anche possibile scrivere controlli mobili completamente funzionali che non utilizzano adattatori di dispositivo. Tuttavia, si consiglia agli sviluppatori di scrivere adattatori di dispositivo nei casi in cui sia appropriato, poiché se i singoli controlli presenti sulla pagina non utilizzano adattatori di dispositivo si perde la maggior parte delle flessibilità dell'architettura.
  • I nuovi controlli creati estendendo quelli esistenti, ad esempio controlli utente, controlli composti e controlli creati mediante ereditarietà contenenti controlli esistenti, non hanno bisogno di adattatori di dispositivo, poiché vengono utilizzati gli adattatori dei controlli contenuti.

Informazioni sul processo di selezione degli adattatori di dispositivo

Nel seguente processo viene descritto come viene scelto un adattatore di dispositivo per una pagina:

  1. ASP.NET consente di scorrere la raccolta dei set di adattatori di dispositivo, come definito dalle sezioni <device> del file Web.config. Si scorre per primo il file Web.config più vicino alla pagina richiesta, quindi tutti gli altri file Web.config successivi in una posizione più alta nella gerarchia di configurazione; l'ultimo sarà il file Machine.config.
  2. Il predicato associato per ogni set di adattatori di dispositivo viene valutato utilizzando gli attributi predicateClass e predicateMethod.
  3. Ogni predicato utilizza l'oggetto HttpContext fornito per esaminare le funzionalità della dispositivo di destinazione e restituisce true o false, ad indicare se i set di adattatori di dispositivo sono applicabili.
  4. Non appena un predicato restituisce true, il set di adattatori di dispositivo in questione viene considerato selezionato. A questo punto, viene utilizzato l'attributo pageAdapter dell'elemento <device> per determinare di quale classe creare un'istanza e per creare l'adattatore.
  5. Se nessuno dei predicati del file Web.config restituisce true, il processo viene ripetuto per i set di adattatori di dispositivo del file Web.config della directory padre.

Per ciascun controllo, è necessario che la pagina fornisca un adattatore di dispositivo al tipo di controllo specificato. In ASP.NET vengono effettuati i seguenti passaggi per scegliere l'adattatore del controllo appropriato:

  1. Il set di adattatori di dispositivo utilizzato è quello scelto per l'adattatore di dispositivo della pagina.

  2. Se nel set di adattatori di dispositivo è presente un elemento <control> che consente di mappare direttamente la classe del controllo a una classe di adattatori di dispositivo, viene creata un'istanza della classe di adattatori specificata.

  3. Se il set di adattatori di dispositivo non può essere mappato in modo diretto, viene creata una nuova istanza della classe base del controllo.

    Il processo viene ripetuto fino a quando non si raggiunge la classe base Control.

    Se, in qualsiasi momento, viene individuato un mapping diretto, viene creata una nuova istanza della classe di adattatori di dispositivo specificata.

  4. Se non è stato ancora individuato alcun mapping e il set di adattatori di dispositivo eredita da un altro set di adattatori, i passaggi per la selezione dell'adattatore vengono ripetuti per il set di adattatori padre. Si risale quindi la gerarchia dei set di adattatori fino a quando non si individua un mapping.

I risultati della ricerca vengono inseriti nella cache, quindi la ricerca specificata deve essere eseguita una sola volta per il primo controllo interessato. Il comportamento descritto in precedenza viene conservato.