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.

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
- Galleria fotografica dinamica con ASP.NET AJAX
- Usare Search come un servizio nei tuoi siti e nei tuoi client
- Mappe nel tuo sito con Virtual Earth
- Integrare Windows Live ID, Contacts e Presence API nelle tue applicazioni
- Introduzione ai cloud based service con Windows Live Services
- Realizzare un custom extender AJAX con ASP.NET 3.5
- Tracciare le modifiche ai dati e allineare i datawarehouse con il Change Data Capture in SQL Server 2008
- Le nuove caratteristiche di IIS 7.0 per sviluppatori e sistemisti
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.





Difficoltà
Utilità
Stampa
Download 


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!