Rozwiązywanie zależności atrybutów w net core mvc

Random image, hand drawn

Dobry .net core

Core wprowadza milusie rozwiązania ułatwiające życie programistów, jednym z nim jest rozwiązanym problem zależności w atrybutach w .net core mvc. Otóż jest sposób na wstrzykiwania zależności do atrybutów mvc. Łot? Już nie będzie bolało? Nie trzeba więcej bleh-bleh-BLEH service-locatora, aby dostać się z miejsca gdzie dzieje się magia do mięska.

Jak? Odrobinę inaczej niż standardowym .net mvc.

Zależności

Zacznę od zdefiniowania prostej zależności oraz jej implementacji:

Dobry, nowy atrybut

Następnie klasę, z której będę korzystać jako atrybutu:

Co ciekawego w kodzie?Zacznę od tego, że nie implementuje (@1) klasy ActionFilterAttribute, lecz poziom niżej IActionFilter. W konstruktorze (@6) definiuje zależność od ILogger. Następnie już-już gdy akcja ma się wykonać tworzę nowym timer (@11,@13) a po zakończeniu metody loguje czas trwania operacji (@18,@19).

Kontener

W startup.cs konfiguruje wbudowany w .net core mvc domyślnie IOC

Dla ILoggera będzie to prosty DebugTraceLogger (@3)

Materializacja atrybutu

Tam gdzie potrzeba i chęć korzystam ze wcześniej zdefiniowanej klasy „atrybutu”. Piszę tak, ponieważ oficjalnie klasa sama w sobie atrybutem nie jest i wymaga lekkiego popchnięcia.

Najważniejsze jest miejsce deklaracji użycia atrybutu (@1), zamiast klasycznego wywołania mojej klasy „atrybutu”, posiłkuje się klasą TypeFilterAttribute która pięknie współgra z IOC w .net core i potrafi rozwiązywać zależności dla klas, którymi się opiekuje. W moim przypadku stworzy DiagnosticsTimerLogger oraz rozwiąże jego zależności czyli ILogger, który zostanie zainstancjonowany jako DebugTraceLogger, ponieważ startup.cs

Finał

Dla mnie bomba! Koniec z ServiceLocatorem, czy innymi równie brzydkimi „rozwiązaniami” na zależności w atrybutach w mvc.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *