2009-08-14 10 views
2

C'est ce que je veux faire:PostSharp et NLog, question de conception générale

  1. Je veux écrire une classe spécifique Aspect orientée NLog de onmethodexecutionaspect.
  2. Mais je veux toujours m'assurer que le code appelant est attribué en utilisant une classe d'attributs générale qui chargera en interne l'implémentation spécifique de NLOG ou TraceX etc. de methodexecutionaspect en fonction de ce qui est spécifié dans le fichier de configuration de l'application.

Quelle est la meilleure façon d'aborder cela?

Je pense à écrire une classe abstraite qui dérivera de l'aspect de l'exécution de la méthode postsharp. Ensuite, je vais avoir une autre DLL qui aura une implémentation spécifique à NLog ... elle aura donc une classe qui dérivera de la classe d'aspect d'exécution de méthode générale que j'ai créée dans la DLL générale.

Le code de consommation ne fera référence qu'à la classe générale dll que j'ai écrite, et cette classe effectuera un chargement de dll spécifique à NLog que j'ai écrit si c'est ce qui est spécifié dans la configuration de l'application.

est logique?

Répondre

3

Je pense que vous êtes sur la bonne voie. Toutefois, essayez plutôt d'utiliser OnMethodBoundaryAspect. Il est plus rapide à l'exécution que OnMethodInvocationAspect. Essayez de tirer parti de l'initialisation à la compilation (CompileTimeInitialize) et de l'initialisation au moment de l'exécution (RunTimeInitialize) et évitez de faire quoi que ce soit de coûteux dans les gestionnaires.

Bonne chance.

-gael

+0

Merci Gaël. Juste besoin d'un peu plus d'aide sur l'approche que j'ai en tête ... où pensez-vous que je devrais mettre le code pour faire la charge des choses spécifiques nlog? Serait-ce dans un constructeur statique de la classe générale (ce dervis de OnMethodBoundaryAspect). Je demande cela parce que je veux m'assurer que les choses de Nlog ne sont pas chargées sur chaque appel à la classe revenant de OnMethodBoundaryAspect, et seulement une fois par application qui a des classes décorées avec ma classe générale dérivant de OnMethodBoundaryAspect. –

+1

Vous pouvez utiliser le constructeur statique, mais assurez-vous de ne pas initialiser votre structure de journalisation lorsque PostSharp est en cours d'exécution (voir PostSharpEnvironment.IsPostSharpRunning). Utilisez RuntimeInitialize lorsque vous souhaitez initialiser quelque chose qui dépend des métadonnées (nom de la classe, nom de la méthode) de la cible d'aspect. Par exemple, si vous devez initialiser une catégorie de trace dont le nom est le nom du type cible, RuntimeInitialize est le bon emplacement. -gael –

+0

Thnx. Je vais me référer à cette API et revenir vers vous pour plus de précisions. –

Questions connexes