Podczas konfigurowania niestandardowych zleceń dla atrybutu [Authorize]
do pracy w MVC firmy Microsoft w wersji 4 i 5, musimy przejść do Global.asax.cs i skonfigurować metodę o nazwie Application_PostAuthenticateRequest()
. Zrobiłem to w moim obecnym projekcie i działa dobrze.MVC 5: W jaki sposób wywołanie Application_PostAuthenticateRequest() w Global.asax?
Jednak to naprawdę mnie boli, jak bardzo wygląda to jak "magia". Application_PostAuthenticateRequest()
nie jest metodą wirtualną. Nie przeciążam ani nie implementuję żadnego istniejącego sygnatury metody w klasie. W jaki sposób struktura MVC może to nazwać? C# jest w końcu językiem ściśle napisanym i nie możesz wywołać metody na klasie, chyba że wiesz, że tam jest.
Jedyny sposób, w jaki mogę to zobaczyć, to odbicie. Może przechodzenie przez metody obiektu końcowego i przypisywanie delegatom dowolnych metod pasujących do określonego podpisu. Ale naprawdę nie mam pojęcia. I nie rozumiem, dlaczego projektanci mogliby to zrobić, a nie tylko wdrażać wirtualną metodę.
Podsumowując, (A), w jaki sposób wywoływana jest Application_PostAuthenticateRequest
, gdy nie jest to zdefiniowana metoda klasy global.asax, oraz (B) dlaczego po prostu nie jest to metoda wirtualna?
Dzięki, że to dobry artykuł. Nie mogę powiedzieć, że rozumiem, dlaczego zrobili to w ten sposób, używając metod wirtualnych. – Pharylon
@Pharylon: Nie mogę wymyślić żadnego rozsądnego powodu. Takie "magiczne" okablowanie automatyczne wydaje się być przeciwne zdrowemu rozsądkowi. –
@Pharylon Wydaje się, że jest to książka tekstowa dla interfejsu. Myślę, że to tylko jedna z tych rzeczy, która "działa" i ma niski priorytet, aby otrzymać jakąkolwiek uwagę na refaktoryzację w przyszłości. Mogą również pojawić się pewne zastrzeżenia dotyczące kompatybilności wstecznej, chociaż nie jestem pewien, co by to było. To zdecydowanie kiepski projekt. Magia i logika nie mieszają się. – crush