2014-04-23 23 views
7

Attualmente sto sviluppando un'applicazione MVC in ASP.NET e sto cercando di separare i problemi in modo da ottenere un codice più pulito e più gestibile.Programmazione orientata agli aspetti in ASP.NET MVC

Quindi, come punto di partenza, stavo pensando a un aspetto di registrazione. La mia idea è di registrare (inizialmente) la chiamata e il ritorno di ogni metodo in ogni controller. Avrei questa logica su una classe separata, dedicata alla registrazione, quindi non rovino il mio codice con le dichiarazioni di registrazione ovunque.

Avrei anche bisogno di avere accesso alla richiesta Http così posso ottenere informazioni sul cliente.

C'è un modo integrato per farlo? È possibile utilizzare ASP.NET MVC con i file di aspetto proprio come AspectJ in Java?

Inoltre, può essere configurato successivamente per registrare i metodi che soddisfano determinate condizioni? (come firma, valore di ritorno, lancio di eccezioni, ecc.)

Grazie in anticipo!

risposta

10

È possibile utilizzare gli attributi per implementare una funzione in modo orientato all'aspetto. metodi di azione che si desidera circondarsi con la vostra funzionalità allora solo bisogno di essere decorata con l'attributo:

[CustomLogger] 
public ActionResult Index() 
{ 
    // Doing something here ... 
    return View(); 
} 

è possibile decorare un unico metodo di azione con un attributo, un intero controllore, o anche applicare l'attributo a livello mondiale attraverso ASP.NET MVC GlobalFilterCollection.

Ecco come ci si dichiara l'attributo:

public class CustomLoggerAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 

     // Here goes your logic 
    } 

    // ... 
} 

La classe ActionFilterAttribute consente di ignorare un paio di metodi in modo da poter collegare in esecuzione azione pipeline ASP.NET MVC:

  • OnActionExecuting
  • OnActionExecuted
  • OnResultExecuting
  • OnResultExecuted

È possibile accedere a variabili di richiesta attraverso i parametri (come ActionExecutedContext) che sono passati ai metodi di cui sopra.

+0

Questo è interessante, può essere utilizzato a livello di controller? Voglio dire, annotare la classe in modo che si applichi automaticamente a tutte le azioni di quel controller. Anche se questo è il caso, però, non mi piace l'idea di annotare i miei controller, stavo pensando a un modo più trasparente, in modo che i controller e l'aspetto del logging siano totalmente indipendenti. Il controller non dovrebbe sapere se è stato registrato o meno. –

+2

@MatiCicero Ora eri più veloce di me. ;-) Sì, puoi applicare l'attributo a un singolo metodo di azione, a un intero controller oa ogni controller in un'applicazione ASP.NET MVC. In questo modo, non è necessario che un singolo controllore sappia dell'attributo: viene utilizzato solo "GlobalFilterCollection.Filters"; Inoltre, non è possibile dimenticare di applicare un attributo a un determinato controller, il che è ottimo per scopi di autenticazione/autorizzazione. –

+0

Ok, ora stiamo parlando @Marius Schulz !! Mi piace questa idea, può essere usata per non registrare tutte le azioni, ma solo quelle che soddisfano qualche firma? Forse sto pensando di usare la riflessione, ma se c'è un modo automatico per farlo, sono tutto orecchie! –

Problemi correlati