Middleware – dalsza inwestygacja

Udostępnij

Przygotowując przykłady do poprzedniego posta – link – natrafiłem na wyjątek: Cannot resolve scoped service 'MyDatabaseContext’ from root provider. Mamy trzy różne sposoby tworzenia middleware i każdy z nich ma zupełnie inną implementację. Dzięki temu, że repozytorium ASP.NET Core jest open source, można się dokładnie przyjrzeć, co tak naprawdę się dzieje „pod spodem”. Poniższy post wrzucam raczej jako ciekawostkę.

Convention-based Middleware

Jest to middleware który tworzymy bez implementacji żadnego interfejsu/klasy bazowej, po prostu musimy spełnić warunek, jakim jest metoda o sygnaturze Task InvokeAsync(HttpContext context). Ten middleware ma dwa warianty. Jeśli chodzi o dependency injection, możemy wstrzykiwać zależności przez konstruktor, albo jako kolejne parametry w metodzie InvokeAsync.

Wersja z konstruktorem jest dosyć prosta, tworzona jest instancja przy użyciu ServiceProvider na poziomie aplikacji (ważne!!) i wywoływana metoda InvokeAsync z jednym parametrem.

W przypadku większej ilości parametrów, sprawdzane jest czy istnieje ServiceProvider na poziomie HttpContext, jeśli nie to dopiero wtedy kod sięga po ServiceProvider na poziomie aplikacji. Dzięki temu w tym przypadku działają zależności typu scoped, ponieważ każda instancja parametru poza pierwszym jest wyciągana z tego właśnie kontenera.

Interface-based Middleware

Tutaj sprawa jest bardzo prosta, tworzona jest faktorka, z której później otrzymujemy instancję middleware. Dzięki temu, jesteśmy w stanie tworzyć normalnie Middleware, które ma zależności typu scoped.

Kod faktorki jest bardzo prosty 😀

Podsumowanie

Nie jestem do końca zwolennikiem podejścia żeby 3 dość podobne mechanizmy działały na 3 różne sposoby. Niestety w przypadku takiego dużego i leciwego codebase, aż tak dużego znaczenia to nie ma. Na pewno bardzo istotna jest kompatybilność wstecz i mało kto chce wprowadzać drastyczne zmiany. Po prostu, jak ktoś potrzebuje nowych rozwiązań, to wykorzystuje najnowszą implementację, jaką jest IMiddleware. Cały kod można znaleźć tutaj link – zachęcam do przeglądania tego repozytorium, można się wiele nauczyć!

Czytaj również  Pattern Matching - potężne zmiany w c#
Scroll to Top