2011-02-01 14 views

risposta

4

Penso che siete alla ricerca di ciò che è chiamato Aspect Oriented Programming. Ci sono molte librerie C# per aiutare con questo. Uno si chiama PostSharp (la versione gratuita di PostSharp supporta questa funzionalità). Ecco un esempio simile all'esempio alce. Questo crea un attributo Trace, che è possibile utilizzare su altri metodi per virare su questa funzionalità in più:

[Serializable] 
public class TraceAttribute : OnMethodBoundaryAspect 
{ 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     Trace.WriteLine("about to call method"); 
    } 

    public override void OnExit(MethodExecutionArgs args) 
    { 
     Trace.WriteLine("just finished calling method"); 
    } 
} 

si dovrebbe aggiungere al metodo di "Pippo", mettendo la Trace attribuire a destra prima di esso:

[Trace] 
public void Foo() { /* ... */ } 

Ora, quando Foo viene eseguito, il metodo OnEntry sopra verrà eseguito prima di esso e OnExit verrà eseguito subito dopo.

+0

posso modificare gli argomenti mentre vengono passati alla funzione? Vedo che li ricevo, ma non posso dire dalla documentazione se posso modificarli. – rpkelly

+0

@rpkelly - Cosa stai specificatamente sperando di fare con gli argomenti? –

+0

Bene, ho bisogno di registrare le chiamate alla funzione e ai suoi valori di ritorno, così come gestire la generazione automatica di un "ID transazione" che viene passato alla funzione (che è attualmente generata altrove). – rpkelly

0

No, non come è stato fatto in Moose. Si potrebbe voler esaminare una libreria AOP.

2

È possibile ottenere lo stesso effetto utilizzando un proxy dinamico. Un esempio è lo Castle Dynamic Proxy.

Tali framework sfruttano le strutture di riflessione C# per costruire classi "proxy" o "wrapper". Quindi, tienilo a mente. C'è una certa quantità di spese generali a causa di questo. In alternativa puoi usare framework che possono create classes statically via code generation.

0

Alcune librerie di isolamento implementano funzionalità che consentono di sostituire le chiamate a metodi con "deviazioni" o metodi di simulazione. Potresti essere in grado di utilizzare la stessa funzionalità per implementare l'intercettazione a cui ti stai riferendo. Per ulteriori dettagli, controllare quanto segue:

Rhino Mocks stubs and mocks are only good for interfaces?

http://research.microsoft.com/en-us/projects/moles/

http://www.typemock.com/typemock-isolator-product3/