Il Provider Model di ASP.NET 2.0

4 pagine in totale: <<Indietro 1 [2] 3 4 Avanti >>

Il pattern Plugin

Nell'esempio appena visto il tipo di strategia utilizzata viene indicato all'atto della costruzione dell'oggetto Context, passando al costruttore una nuova istanza della strategia concreta di interesse. Questo aspetto rappresenta un limite in termini di estendibilità, in quanto la dipendenza tra i tipi viene definita direttamente nel codice e quindi risulta essere nota anche all'atto della compilazione.

Per ovviare a questo problema è necessario individuare un modo per poter definire a runtime la dipendenza tra l'oggetto Context e la strategia concreta. A questo proposito torna comodo il pattern Plugin (noto anche come Inversion of Control oppure Dependency Injection), in base al quale è possibile definire una modalità per linkare le classi tra loro in fase di configurazione piuttosto che in compilazione.

Nell'ambito del .NET Framework l'oggetto che fornisce le funzionalità di acquisizione a runtime dei dati di configurazione per una applicazione web è la classe statica RuntimeConfig contenuta nel namespace System.Web.Configuration. La classe RuntimeConfig contiene la rappresentazione delle varie sezioni del file di configurazione ed espone per ciascuna di esse una proprietà specifica, tramite cui è possibile risalire al valore di ogni impostazione.

Il pattern Provider utilizzato in ASP.NET 2.0

Finora abbiamo parlato del pattern Strategy, dei vantaggi che comporta e dei suoi limiti. Il pattern Provider, sfruttando la Dependency Injection, supera il vincolo imposto dalla necessità di definire le dipendenze a compile-time e permette di linkare i vari oggetti in fase di esecuzione, creando una istanza del tipo opportunamente inizializzato tramite il metodo statico Activator.CreateInstance(Type).

In ASP.NET 2.0 la maggior parte dei Provider deriva direttamente o indirettamente dalla classe astratta ProviderBase contenuta nel namespace System.Configuration.Provider. La classe base espone tre membri pubblici, due proprietà (Name e Description) e il metodo Initialize() che viene richiamato ogni qualvolta una nuova istanza di un Provider viene creata.

public abstract class ProviderBase
{
  //Methods
  protected ProviderBase();
  public virtual void Initialize(string name,NameValueCollection config);

  // Properties
  public virtual string Description { get; }
  public virtual string Name { get; }

  // Fields
  private string _Description;
  private bool _Initialized;
  private string _name;
}

Non tutti i Provider derivano da ProviderBase: per esempio, BuildProvider deriva direttamente da System.Object, mentre VirtualPathProvider deriva da System.MarshalByRefObject. In ogni caso per ogni Provider esiste sempre un tipo astratto che definisce l'interfaccia comune per tutte le implementazioni concrete e che funge da contratto. I due Provider citati meritano una trattazione a parte in quanto hanno un comportamento che concettualmente è simile a quello degli altri Provider, ma in pratica entrambi seguono regole e schemi diversi. In questo articolo viene trattato il modello generale, tralasciando i casi particolari sopra indicati, per i quali si rimanda ad articoli specifici.

Provider - Diagramma delle classi

Gli oggetti che partecipano nell'ambito del pattern Provider sono:

  • ProviderBase: è la classe astratta base predefinita per i Provider nell'ambito del .NET Framework;
  • AbstractProvider: è un tipo astratto che dichiara una interfaccia comune per tutti i Provider concreti. Manager espone una proprietà di tipo AbstractProvider che utilizza per richiamare i membri di un ConcreteProvider;
  • ConcreteProvider: rappresenta una particolare strategia di implementazione usando l'interfaccia definita da AbstractProvider;
  • Manager: espone una proprietà di tipo AbstractProvider che utilizza per richiamare i membri di un ConcreteProvider. Utilizza un metodo privato di inizializzazione per effettuare la Dependency Injection, caricando uno specifico ConcreteProvider a runtime.

In genere la classe che funge da Manager è una classe statica con tutti i membri pubblici e privati di tipo statico. Essa espone gli stessi metodi della classe astratta AbstractProvider (o un sottoinsieme di essi) e presenta la proprietà di sola lettura Provider (di tipo AbstractProvider), utile a contenere il tipo di Provider concreto caricato a runtime. A titolo di esempio, di seguito viene riportato il codice relativo alla proprietà Provider dell'oggetto Membership.

public static MembershipProvider Provider
{
    get
    {
        // Inizializzazione (Dependency Injection)
        Membership.Initialize();
        // Ritorna l'istanza del Provider concreto caricato a runtime
        return Membership.s_Provider;
    }
}

4 pagine in totale: <<Indietro 1 [2] 3 4 Avanti >>

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC