9
votes

Utilisation des attributs personnalisés C # pour la journalisation des pistes d'exception et d'audit

est-il possible de créer une fonctionnalité personnalisée qui capture des exceptions effectuées dans une méthode définie par un attribut personnalisé?

Im envisage de faire quelque chose comme ceci: P>

[Logging(FeatureEnum.SomeFeature, IntentEnum.SomeIntent, "some comment")]
public void SomeMethodThatDoesATask()
{
    try
    {
      var doSomeAction = new LazyProcess();
      doSomeAction.WhoDunnit();
    }
    catch(Exception ex)
    {
       StaticMethodThatDoesLogging.CatchError(ex);
    }
}


3 commentaires

Connaissez-vous la bibliothèque post-stache? SharpCrafters.com/postSharap (pas gratuit).


Bonjour Uwe, la raison pour laquelle je fais la mienne.


Juste mon opinion, mais l'édition de la communauté (qui est gratuite, la sorte) a plus que suffisamment de capacités pour la plupart des utilisations. J'ai lu qu'il y a des travaux postparp sérieux de sorcellerie et je préférerais leur faire face à cela. Sinon, bonne chance!


3 Réponses :


7
votes

Cela ne peut pas être facilement réalisé. Par exemple, Typemock utilise l'API de Profiler .NET Framework pour surveiller l'exécution d'une application. Il vous permet de vous inscrire à différents événements et d'être notifié lorsqu'une méthode est appelée, une exception se produit, ... mais cela ne sera pas une tâche facile.

D'autre part, vous pouvez utiliser un AOP, mais vous devez modifier votre code afin que l'appelant utilise un proxy généré au lieu de la classe réelle. Spring.net a quelques fonctionnalités intéressantes à ce sujet.

Donc, essentiellement sans utiliser l'API de Profiler .NET Framework Framework ou sans écrire un code personnalisé qui lit les attributs d'une classe donnée à l'aide de la réflexion, vous ne pouvez pas y parvenir. Les attributs ne sont que des métadonnées de classe et sans quelque chose qui aurait un sens d'eux, ils ne font rien.


1 commentaires

Je suis d'accord - il est préférable d'utiliser la bibliothèque plutôt que la mise en œuvre propre.




1
votes

Les attributs ne sont que des métadonnées. Vous auriez besoin de faire le tissage du code, en utilisant quelque chose comme postSharp ou utiliser une bibliothèque d'interception d'exécution telle que Castle.DynamicProxy. Par eux-mêmes, les attributs ne contiennent aucune fonctionnalité réelle à l'application, à l'exception de la réflexion.

Si vous avez une ligne de code à l'intérieur de la méthode qui effectue la journalisation, vous pouvez obtenir la charrue de la méthode d'appel, utilisez la réflexion pour vérifier l'attribut, et aller de là. Je suppose que c'est ce que vous vouliez faire avec staticmethattDoesLogging. xxx


1 commentaires

Espérons que cela compile. Je n'ai pas de studio visuel à portée de main pour l'essayer moi-même. J'ai beaucoup fait cela récemment alors je travaille de la mémoire.