Décorer méthode avec des attributs personnalisés
J'ai quelques fonctions pour lesquelles je veux du journal le temps consommé.
DBResult LongTask(DBCommand command)
{
...
}
Est-il un moyen de attchieve ce
[LogTimeUsed()]
DBResult LongTask(DBCommand command)
{
...
}
Afin que je puisse avoir la classe/fonction quelque part qui est appelée à chaque fois lorsque cette fonction est appelée et je peux injecter mon propre code, avoir accès à la commande et DBResult et journal de le temps passé dans la fonction?
OriginalL'auteur 0xDEAD BEEF | 2011-03-09
Vous devez vous connecter pour publier un commentaire.
Il n'est pas intégré dans la façon de le faire .NET.
Si votre souhait est pas d'utiliser un 3ème partie les bibliothèques (comme vous l'avez dit dans un de vos commentaires), en faisant le code de tissage ou de dynamique de génération de proxy est beaucoup de travail. Dans ce cas, il est préférable de ne pas utiliser les attributs et aller avec le décorateur. Voici un exemple:
Et maintenant, vous pouvez écrire un décorateur pour le IMyLongRunningTask:
Lorsque vous utiliser l'injection de dépendance, vous pouvez facilement configurer une
MyLongRunningTaskMonitor
être renvoyée lorsqu'uneIMyLongRunningTask
est demandé. Par exemple:Oh. Mais cette approche me force à utiliser "spécifique" de la syntaxe, lors de la création d'instances de classe.
À l'aide de l'Injection de Dépendance modèle de forces dans une direction spécifique (parce que c'est ce que modèles de le faire). DI/Cio cadres ont chacun leur propre langue pour la configuration de cette dépendance de câblage. Lorsque vous utilisez la DI correctement, vous pouvez garder tous vos codes (sauf le code de démarrage) de votre application gratuit de ce câblage.
OriginalL'auteur Steven
Vous pouvez utiliser Château DynamicProxy.
Pourquoi voulez-vous écrire vous-même? Il est difficile de réinventer la roue. - Vous pouvez toujours obtenir le Château de code source et de voir comment ils l'ont fait - c'est l'open source.
OriginalL'auteur Jakub Konecki
Si vous n'êtes pas de la manipulation de ce type particulier de l'attribut de vous-même, vous devriez regarder dans la Programmation Orientée Aspect, en utilisant quelque chose comme PostSharp
OriginalL'auteur Matthew Abbott
Vous pouvez faire cela en utilisant PostSharp
Également de vérifier la réponse à ma question sur SOI - Orientée aspects de la Journalisation avec l'Unité\T4\autre chose
OriginalL'auteur Unmesh Kondolikar
Juste pour ajouter à la liste des tiers choses là-bas est le printemps de l'AOP (Printemps est grande et populaire cadre qui a été porté pour .net à partir de Java)
http://www.springframework.net/doc-latest/reference/html/aop.html
OriginalL'auteur andrew pate
La question est à la recherche d'un moyen de créer un décorateur en c# à l'aide de c# attributs, pour tenter de créer le décorateur syntaxe comme on le voit en python (qui est excellent... C# de la communauté de prendre note)
Quelque chose de semblable pourrait être obtenue par l'incorporation de la "caractéristique" dans votre nom de la méthode (par exemple, LongTask_LogTimeUsed) alors une petite quantité de (standard) code à l'INTÉRIEUR de la LongTask méthode de lecture de son nom de méthode de déléguer le pré ou post-traitement hors appropriée des gestionnaires:
Comment obtenir le nom de la méthode actuelle de code
Comment se passer des paramètres au cours de la pré-ou de post-processeurs aurait besoin de penser à bien.
OriginalL'auteur andrew pate