Domanda

Che cos'è un oggetto proxy in senso di inversione di controllo / orientato all'aspetto?

Qualche buon articolo su cosa sia un oggetto proxy?
Perché vorresti usarne uno?
E come scriverne uno in C #?

È stato utile?

Soluzione

In generale, un oggetto Proxy è un oggetto (istanza di una classe) che espone la stessa identica interfaccia pubblica di una "classe reale". ma semplicemente inoltra tutte le chiamate fatte ai suoi membri all'altra classe reale. Gli oggetti proxy vengono utilizzati per una serie di motivi ...

Uno scopo è "pretendere" essere la vera classe in modo che un componente client (o oggetto) possa " credere " sta parlando con il "reale" oggetto, ma all'interno del proxy, altre cose (come la registrazione, il supporto transazionale, ecc.) vengono eseguite contemporaneamente ... In secondo luogo, un proxy può essere molto economico in confronto all'oggetto reale. e spesso viene utilizzato in modo che gli oggetti reali possano essere conservati (disattivati ??o rilasciati in un pool per essere utilizzati da altri client) quando il client non li utilizza ... Il proxy rimane "vivo". e il cliente pensa che abbia ancora una connessione con l'oggetto reale, ma ogni volta che "chiama" l'oggetto, in realtà sta chiamando il proxy, che va e ottiene un altro oggetto reale solo per gestire la chiamata, quindi rilascia l'oggetto reale al termine della chiamata.

Per quanto riguarda Inversion of Control (IOC). Ciò si riferisce a un modello comune (noto anche come Iniezione delle dipendenze), in cui gli oggetti dipendenti all'interno di una classe vengono "iniettati". in un'istanza della classe, dal codice client, per controllare quale versione di un oggetto dipendente verrà utilizzata dall'istanza ... IOC può essere utilizzato per iniettare un "Proxy"; oggetto in una classe in cui pensa di utilizzare l'oggetto reale ... La frase Inversion of Control si riferisce al fatto che quando si utilizza questo modello, la decisione su quale viene chiamata l'implementazione effettiva non è più sotto il controllo della classe che effettua la chiamata, ma al client di quella classe, quando inietta un'istanza di un oggetto dipendente nella classe da utilizzare per questa chiamata.

Generalmente il termine IOC viene utilizzato con quello che viene chiamato Contenitore IOC , che è una classe specificamente progettata per essere responsabile della creazione di istanze di classi dipendenti basate su informazioni vagamente accoppiate su tali classi (Tipi) che ottiene da una fonte diversa dalle dipendenze cablate (il più delle volte da un qualche tipo di file di configurazione). Generalmente, quando usi un contenitore IOC, ne crei un'istanza all'avvio dell'applicazione e quindi (leggendo i dati di configurazione o altro), "registri". ciascuna delle classi (tipi) di cui sarà responsabile il contenitore IOC, con un valore chiave. La chiave è spesso il tipo o l'interfaccia astratta che tutte le istanze di questa registrazione devono implementare). Quindi, nelle normali operazioni della tua applicazione, dove altrimenti potresti avere una nuova istanza di uno di questi tipi, chiami il contenitore IOC e gli chiedi invece un'istanza, usando il tipo astratto / Interfaccia come chiave . Il contenitore IOC utilizza quindi la riflessione o il caricamento dinamico (o qualsiasi altra cosa) per creare un'istanza di qualunque tipo sia stata "registrata". con quella chiave. In questo modo, semplicemente modificando i dati di configurazione, è possibile controllare i tipi effettivi utilizzati dall'applicazione, modificandoli in un ambiente o percorso di distribuzione da quelli utilizzati in un altro.

Altri suggerimenti

Un'ottima risorsa a riguardo è la vecchia "banda di quattro" libro di modelli di design. Questo libro è molto utile per chiunque sviluppi software orientato agli oggetti. Personalmente sto usando oggetti proxy per il caricamento lento con NHibernate. Non utilizzo i proxy con inversione di controllo perché risolvo i tipi interfacciati solo con il mio IoC.

La spiegazione di Charles Bretana è molto buona.

Non riesco a immaginare la relazione tra proxy e AoP. Qualcuno potrebbe spiegarlo qui?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top