Bonjour,
J'ai besoin d'injecter du code, lors de l'exécution dans/autour des méthodes de différentes classes.
Par exemple :
J'ai un hôte qui est en mesure de générer un proxy à partir d'une interface et d'une implémentation qu'il est également en mesure de sélectionner, via une configuration quelconque.
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public interface IService { int Random(int maxValue); void DisplayText(string text); void DisplayRandom(int max); } public class Service : IService { Random r = new Random(); public int Random(int maxValue) { return r.Next(maxValue); } public void DisplayText(string text) { Console.WriteLine(text); } public void DisplayRandom(int max) { DisplayText(Random(max).ToString()); } }
Le proxy peut être configuré pour réaliser diverses opérations, comme tracer les entrées/sorties des méthodes.
A partir de là, des choses comme suit sont possibles :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Host host = new Host(); IService service = host.GetService<IService>(); service.DisplayRandom(100);
Si le proxy est configuré pour annoncer sur la sortie standard "calling methodname" et "methodname done" à chaque appel de méthode, alors, l'exemple précédent affichera (par exemple) :
Cela est dû au fait que le proxy est actuellement implémenté comme une classe abstraite ServiceProxy implémentant l'interface IService grâce à une composition. Autrement dit, une instance de Service est stockée dans le proxy.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3calling DisplayRandom 84 DisplayRandom done
Chaque méthode du proxy est décorée avec diverses choses (ici, l'affichage de la trace sur la sortie standard).
Seulement, voilà le souci, DisplayRandom fait appel à DisplayText et Random. Et j'aimerais que l'indirection se fasse également à ce niveau là, de façon transparente.
Autrement dit, l'exemple précédent devrait afficher :
Des idées ? Des questions ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7calling DisplayRandom calling Random Random done calling DisplayText 84 DisplayText done DisplayRandom done
Merci.
Partager