Oggetti estensibili

Questo modello viene utilizzato per estendere le classi di runtime esistenti con nuove funzionalità oppure per aggiungere un nuovo stato a un oggetto. Le estensioni, allegate a uno degli oggetti estensibili, attivano i comportamenti in fasi molto diverse dell'elaborazione per accedere a stato e funzionalità condivisi allegati a un oggetto estensibile comune al quale possono accedere.

Modello IExtensibleObject<T>

Nel modello di oggetti estensibili sono disponibili tre interfacce: IExtensibleObject, IExtension e IExtensionCollection.

L'interfaccia IExtensibleObject viene implementata dai tipi che consentono agli oggetti IExtension di personalizzare la funzionalità.

Gli oggetti estensibili consentono l'aggregazione dinamica di oggetti IExtension. Gli oggetti IExtension sono caratterizzati dall'interfaccia seguente:

public interface IExtension<T>
where T : IExtensibleObject<T>
{
    void Attach(T owner);
    void Detach(T owner);
}

Tramite la restrizione dei tipi è possibile garantire che solo le estensioni possano essere definite per le classi IExtensibleObject. Attach e Detach forniscono una notifica dell'aggregazione o disgregazione.

È consigliabile limitare le implementazioni quando possono essere aggiunte e rimosse da un proprietario. Ad esempio, è possibile impedire completamente la rimozione, impedire l'aggiunta o la rimozione delle estensioni quando il proprietario o l'estensione sono in un determinato stato, impedire l'aggiunta contemporaneamente a più proprietari o consentire solo una singola aggiunta seguita da una singola rimozione.

IExtension non implica alcuna interazione con le altre interfacce standard gestite. In particolare, il metodo System.IDisposable.Dispose sull'oggetto proprietario in genere non disconnette le relative estensioni.

Quando si aggiunge un'estensione all'insieme, il metodo Attach viene chiamato prima dell'aggiunta all'insieme. Quando si rimuove un'estensione dall'insieme, il metodo Detach viene chiamato dopo la rimozione. Ciò significa che (presupponendo che la sincronizzazione avvenga correttamente) un'estensione può essere disponibile nell'insieme solo tra Attach e Detach.

L'oggetto passato al metodo FindAll o al metodo Find non deve necessariamente essere IExtension (ad esempio, è possibile passare qualsiasi oggetto), ma l'estensione restituita è un'interfaccia IExtension.

Se nessuna estensione nell'insieme è IExtension, Find restituisce un valore null e FindAll restituisce un insieme vuoto.  Se più estensioni implementano IExtension, Find restituisce una di esse. Il valore restituito dal metodo FindAll è un'istantanea.

Sono disponibili due scenari principali. Nel primo scenario la proprietà Extensions viene utilizza come un dizionario basato sui tipi per inserire lo stato su un oggetto allo scopo di consentire a un altro componente di ricercarlo utilizzando il tipo.

Nel secondo scenario vengono utilizzate le proprietà Attach e Detach per consentire a un oggetto di partecipare a un comportamento personalizzato, ad esempio la registrazione per gli eventi, il controllo delle transizioni di stato e così via.

L'interfaccia IExtensionCollection è un insieme di oggetti IExtension che consentono di recuperare l'interfaccia IExtension in base al tipo. System.ServiceModel.IExtensionCollection.Find restituisce l'ultimo oggetto aggiunto che è un'interfaccia IExtension di quel tipo.

Oggetti estensibili in Windows Communication Foundation

Nel sistema Windows Communication Foundation (WCF) esistono quattro oggetti estensibili:

  • ServiceHostBase: è la classe base per l'host del servizio. Le estensioni di questa classe possono essere utilizzate per estendere il comportamento di ServiceHostBase o per archiviare lo stato per ogni servizio.
  • InstanceContext: questa classe collega un'istanza del tipo del servizio con il runtime del servizio. Contiene informazioni sull'istanza e un riferimento alla classe ServiceHostBase che contiene la classe InstanceContext. Le estensioni di questa classe possono essere utilizzate per estendere il comportamento di InstanceContext o per archiviare lo stato per ogni servizio.
  • OperationContext: questa classe rappresenta le informazioni dell'operazione che il runtime raccoglie per ogni operazione. Tra queste informazioni sono incluse le intestazioni dei messaggi in arrivo, le proprietà dei messaggi in arrivo, l'identità di protezione dei messaggi in arrivo e altre informazioni. Le estensioni di questa classe possono estendere il comportamento di OperationContext o archiviare lo stato per ogni operazione.
  • IContextChannel: questa interfaccia consente l'ispezione di ogni stato per i canali e i proxy compilati dal runtime di WCF. Le estensioni di questa classe possono estendere il comportamento di IClientChannel o utilizzarlo per archiviare lo stato per ogni canale.

Nell'esempio di codice seguente viene illustrato l'uso di un'estensione semplice per tenere traccia degli oggetti InstanceContext.

Vedere anche

Riferimenti

IExtensibleObject
IExtension
IExtensionCollection