2013-10-02 13 views
5

Sto cercando di utilizzare post sharp e sto cercando di mettere insieme alcune demo. Uno di questi era un aspetto che registra le eccezioni e un altro era controllare gli argomenti nulli e lanciare un'eccezione quando ne si incontra uno.Applicazione di aspetti agli aspetti con postsharp

Il problema che sto avendo è che voglio il mio aspetto di registrazione delle eccezioni per registrare le eccezioni generate dall'aspetto di controllo nullo. Non sembra funzionare. Qualcuno sa di un modo per farlo funzionare?

EDIT: Per essere chiari, il registratore eccezione sta lavorando con eccezioni generate al di fuori di un aspetto, ma isnt registrazione eccezioni thown sulla NullCheckAttribute

Il codice per il nulla controllo aspetto è come segue

[Serializable] 
public class NullCheckAttribute : OnMethodBoundaryAspect 
{ 
    [ExceptionLogger] 
    public override void OnEntry(MethodExecutionArgs args) 
    { 
     foreach (var argument in args.Arguments) 
     { 
      if (argument == null) 
       throw new InvalidOperationException("Null argument in " + args.Method.Name); 
     } 
    } 
} 

E il codice per l'eccezione logger

[Serializable] 
public class ExceptionLoggerAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnException(MethodExecutionArgs args) 
    { 
     Console.WriteLine("Exception thrown in " + args.Method.Name); 
     Console.WriteLine("***Message: " + args.Exception.Message); 
     Console.WriteLine("***Stack trace: " + args.Exception.StackTrace); 
    } 
} 

Vorrei anche ricordare che sto semplicemente utilizzando una licenza gratuita per Questo.

+1

'Non sembra funzionare. - Cosa sta succedendo esattamente? – Muctadir

+0

Il logger delle eccezioni funziona correttamente con le normali eccezioni, ma quelli che vengono lanciati nel NullCheckAttribute non vengono registrati. –

+0

hai eseguito il debug di 'NullCheckAttribute' per vedere che' MethodExecutionArgs' è effettivamente nullo? – Muctadir

risposta

7

PostSharp non consente di applicare aspetti su una classe di aspetto, che è ciò che si sta tentando di fare applicando [ExceptionLogger] nella classe NullCheckAttribute.

Attualmente, se un attributo aspetto viene rilevato su una classe aspetto, viene automaticamente ignorato. Si comporta in questo modo perché la maggior parte delle volte questa applicazione non è intenzionale (attraverso il multicasting).

Il modo corretto per ottenere l'effetto desiderato (registrare l'eccezione generata dal controllo Null) è applicare entrambi gli attributi al metodo di destinazione. Inoltre, tieni presente che l'ordine degli attributi applicati è importante. Se lo si modifica per questo esempio, non verrà visualizzato il messaggio di log, poiché il controllo Null verrà eseguito prima del try/catch introdotto dal logger delle eccezioni.

[ExceptionLogger(AspectPriority = 1)] 
    [NullCheck(AspectPriority = 2)] 
    private void TestMethod(string s) 
    { 
     Console.WriteLine(s); 
    } 
+0

Grazie per l'aiuto :) –

Problemi correlati