Chciałbym dodać do Daniela odpowiedź na praktyczny przykład. (jego odpowiedź jest bardzo szczegółowa i poprawna, najpierw sprawdź to).
TL; DR:
services.Add
nie jest bezpośrednio związane z middleware. Chodzi o rejestrowanie zależności w Dependency Injection Container.
app.Use
polega na wybieraniu czereśni, który kod będzie działał w potoku (do logiki), w jakiej kolejności, i jeśli pozwala na kontynuowanie przetwarzania potoku. Wyobraźnia jest granicą tutaj, jednym z przykładów byłoby pisanie middleware, że w zależności od adresu IP, można pokazać stronę, która mówi: „Niestety usługa nie jest dostępna w Twoim kraju”)
app.UseMiddleware
jest taka sama jak app.Use
ale zamiast deklarować kod w linii, określasz klasę, która będzie miała metodę Invoke, która będzie dla ciebie wywoływana.
Teraz przejdźmy do jakiegoś przykładowego kodu:
Powiedzmy chcesz aplikację przetworzyć wyjście lub niektórych wydrukach, jak minifing kod HTML.
Możesz dodać oprogramowanie pośrednie, które przechwytuje odpowiedź, zanim zostanie zapisane na wyjściu i zminimalizować je.
Więc można użyć:
app.Use(async (context, next) =>
{
await next(context);
context.Response // will have the response as processed by all the previous middleswares like mvc.
if IsMinifiable(context.Response)
MinifyResponse(context.Response);
});
Jeśli chcesz podzielić się swoją middleware w różnych aplikacjach lub przez innych, może chcesz stworzyć middleware i użyć go bardziej jak:
app.UseMiddleware<HtmlMinifierMiddleware>();
wykona całą pracę za pomocą pojedynczego wiersza kodu w metodzie configure. Powszechną praktyką jest wysyłanie metod rozszerzeń, takich jak app.UseHtmlMinifier()
i zwracanie określonych obiektów, które mogą być powiązane dla konfiguracji lub parametrów konfiguracyjnych wsparcia. Używanie rozszerzenia daje dużo elastyczności, czytelność i API ujawniania: D
teraz wyobrazić swoją middleware jest delcared coś takiego:
public class HtmlMinifierMiddleware {
public HtmlMinifier(IHtmlMinifier minifier) {
// ...
}
public string Minify(string content) {
return minifier.Minify(content);
}
// ...
}
jak widać, trzeba zdać IHtmlMinifer, więc trzeba zarejestrować go dla DI.
ta realizowana jest na ConfigureService jak:
services.AddScoped<IHtmlMinifier, MyCoolHtmlMinifier>();
teraz wyobraź sobie, że nie potrzebujemy 1, ale wiele zależności, to będzie się do autora/konsumenta middleware znać każdy pojedynczy zależność, która musi być zarejestrowany.
Autorzy oprogramowania pośredniego zwykle wysyłają rozszerzenie, aby ułatwić korzystanie z programistów takich jak: services.AddHtmlMinifier()
, co jest właśnie tym sposobem rozszerzenia usług rejestru do DI Container.
Nawet jeśli nie korzystasz z oprogramowania pośredniego, możesz wykorzystać zależność własnej aplikacji przy użyciu tego samego wzorca.
Na przykład, jeśli aplikacja jest e-commerce, można utworzyć metody rozszerzenie, które rejestrują swoje zależności: services.AddProductManagement()
, services.AddPriceCalculator()
, services.AddSearching()
, itp, lub po prostu services.AddMyCoolApplication()
aby zapewnić czysty sposób dodawania (rejestracji) swoich usług (zależności) do znalezienia przez DI Container dla twojej aplikacji.
link był bardzo pomocny, dzięki – wodzu