Iniezione di codice

Ogni tanto si sente parlare di Aspect Oriented Programming, una metodologia di programmazione che tra le varie cose permette di "iniettare" del proprio codice all'interno di classi già esistenti (per una definizione più rigorosa http://en.wikipedia.org/wiki/Aspect-oriented_programming).
Andrea durante un workshop ci aveva spiegato che benchè si cercasse in .NET di AOP c'è né poco.
Ma sei io volessi poter iniettare del codice in un metodo?
Se ho accesso al codice sorgente del metodo da "farcire" posso fare qualcosa limitando l'impatto sul codice esistente: usare gli eventi.
L'esecuzione dei gestori degli eventi in .NET è sincrona quindi posso sfruttare questa caratteristica per dare la possibilità ad altri programmatori di inserire del codice nelle mie librerie:

public class Foo
{
 public event EventHandler DoSomethingElse;

 public void Bar()
 {
  if (DoSomethingElse != null)
   DoSomethingElse(this, EventArgs.Empty);
   
  Console.WriteLine("Sono in Foo.Bar");
  
  if (DoSomethingElse != null)
   DoSomethingElse(this, EventArgs.Empty);
 }
}

Il metodo Bar lancia due eventi: uno all'inizio e uno alla fine della sua eseczione. Quindi:
public static void Main(String[] args)
{
 Foo f = new Foo();
 f.DoSomethingElse += new EventHandler(Interceptor);
 f.Bar();
}


private static void Interceptor(Object sender, EventArgs e)
{
 Console.WriteLine("Sono nel MAIN");
}

In pratica è come se il corpo del metodo Interceptor venisse iniettato all'interno del metodo Bar.

Naturalmente è una tecnica molto "casereccia", però in certi casi può tornare utile.

Print | posted on Friday, February 10, 2006 4:46 PM