2014-09-17 15 views
7

Quando si impostano principal personalizzate per l'attributo [Authorize] per funzionare in MVC di Microsoft versione 4 e 5, è necessario accedere a Global.asax.cs e impostare un metodo chiamato Application_PostAuthenticateRequest(). L'ho fatto nel mio attuale progetto e funziona perfettamente.MVC 5: Come viene chiamato Application_PostAuthenticateRequest() in Global.asax?

Tuttavia, mi dà fastidio quanto ciò sembri "magico". Application_PostAuthenticateRequest() non è un metodo virtuale. Non sto sovraccaricando o implementando alcuna firma di metodo esistente nella classe. Quindi, come fa il framework MVC a chiamarlo? C# è un linguaggio fortemente tipizzato, dopo tutto, e non si arriva a chiamare un metodo su una classe a meno che non si sappia che è lì.

L'unico modo che posso vedere è farlo tramite Reflection. Forse passando attraverso i metodi dell'oggetto finale e assegnando i metodi che corrispondono a una determinata firma ai delegati. Ma davvero non ne ho idea. E non capisco perché i designer lo farebbero piuttosto che implementare un metodo virtuale.

Quindi, in breve, (A) come viene chiamato Application_PostAuthenticateRequest quando non è un metodo definito della classe global.asax e (B) perché non lo hanno semplicemente reso un metodo virtuale?

risposta

4

C'è un articolo completo su questo di Rick Strahl. In breve, il runtime utilizza la riflessione sulla classe di applicazione globale.

http://weblog.west-wind.com/posts/2009/Jun/18/How-do-ASPNET-Application-Events-Work

Questo tipo di cablaggio evento è solitamente chiamato "automatico" ed è anche presente a livello di pagina. Ad esempio, lo Page_Load viene chiamato solo a causa del collegamento automatico automatico predefinito.

http://msdn.microsoft.com/en-us/library/system.web.configuration.pagessection.autoeventwireup(v=vs.110).aspx

+2

Grazie, questo è un buon articolo. Non posso dire di aver capito perché lo hanno fatto in questo modo rispetto ai metodi virtuali, però. – Pharylon

+0

@Pharylon: Non riesco a pensare a nessuna ragione ragionevole. Tale "magico" cablaggio automatico sembra essere contro ogni senso comune. –

+1

@Pharylon Sembra il caso del libro di testo per un'interfaccia. Penso che sia solo una di quelle cose che "funziona" ed è di bassa priorità ricevere un'attenzione per il refactoring in futuro. Potrebbero esserci anche alcuni problemi di retrocompatibilità, anche se non sono sicuro di quali sarebbero. È decisamente un design scadente. Magia e logica non si mescolano. – crush

Problemi correlati