2009-08-20 9 views
0

Fondamentalement, j'essaie d'implémenter une sorte de programmation orientée aspect pauvre en C#. J'avais pensé à utiliser un ContextAttribute mais ils semblent seulement être liés au niveau de la classe. Y a-t-il un moyen de mettre un attribut de telle sorte qu'il reçoive les mêmes paramètres que la méthode qu'il annote ou d'une manière ou d'une autre d'accéder au contexte dans lequel il a été déclenché?Obtention du contexte d'attribut en C#

J'ai ce code

public void AddUser(User user) 
{ 
    var errors = DataAnnotationsValidationRunner.GetErrors(user); 
    if (errors.Any()) 
      throw new RulesException(errors); 
    users.Add(user); 
} 

dont je voudrais extraire les 3 premières lignes, donc j'avais quelque chose comme

[Validated] 
public void AddUser(User user) 
{ 
    users.Add(user); 
} 

Répondre

2

Je pense qu'il vous manque un troisième composant. La plupart des implémentations AOP (par exemple, Aspect#) reposent sur un proxy ou un intercepteur pour exécuter réellement le code. Dans votre scénario, vous n'avez pas le composant nécessaire pour 1) savoir que l'attribut existe sur la méthode et 2) déclencher le mécanisme (ou le devenir) nécessaire pour exécuter le code dans l'attribut.

Heureusement, il existe déjà de nombreuses solutions (assez) simples en open source. L'option la plus simple que je peux penser serait d'utiliser un tisserand à la compilation comme PostSharp. Prenez une copie de cela, et dans les exemples, vous trouverez plusieurs exemples de ce que vous essayez de faire (vous seriez intéressé par le OnMethodInvocationAspect).

Le résultat final est que votre code ressemble exactement à l'exemple que vous avez fourni, mais il exécute également le code que vous souhaitez.

+0

+1 pour PostSharp –

+0

C'est parfait, je ne me suis pas rendu compte qu'il y avait un tisserand d'aspect pour C# ayant lu quelque part que ce n'était pas possible. Je suppose que postsharp sort de http://zombo.com où l'impossible est possible. – stimms

+0

Juste pour info, jetez un oeil aux plugins qui viennent avec Postsharp. Je sais que log4postsharp (qui marie log4net et postsharp) vient avec l'attribut log [] qui enregistrera l'entrée/sortie dans une méthode (y compris la réflexion sur tous les paramètres passés (et leurs valeurs!)). Vous pouvez simplement réécrire ce code pour faire la validation que vous souhaitez. Cela vous ferait certainement gagner du temps ... –

1

Je ne sais pas exactement comment votre solution devrait ressembler, mais en C#, les attributs n'exécutent pas de code tant que vous ne les demandez pas (pour autant que je sache). Et si vous interrogez pour l'attribut, vous avez également le contexte. Donc, à mon avis, il y a quelque chose qui ne va pas dans votre stratégie.

Questions connexes