Ich mag es, Daniel ein praktisches Beispiel zu beantworten. (seine Antwort ist sehr detailliert und korrekt, überprüfe das zuerst).
TL; DR:
services.Add
ist nicht direkt mit Middleware zusammen. Es geht darum, Abhängigkeiten im Dependency-Injection-Container zu registrieren.
app.Use
ist über Rosinenpicken, welcher Code in der Pipeline laufen wird (Logik machen), in welcher Reihenfolge, und ob die Pipeline weiter verarbeitet werden darf oder nicht. Die Phantasie ist die Grenze hier wäre ein Beispiel eine Middleware werden writting, die in Abhängigkeit von der IP-Adresse, Sie eine Seite zeigen, die sagen: "Entschuldigung Service in Ihrem Land nicht verfügbar ist)
app.UseMiddleware
es ist das gleiche wie app.Use
Anstatt jedoch den Code inline zu deklarieren, geben Sie eine Klasse an, die über eine Invoke-Methode verfügt, die für Sie aufgerufen wird. Jetzt
, lassen Sie uns bis zu einem gewissen Beispielcode erhalten:
Angenommen, Sie haben Ihre Anwendung die Ausgabe oder einige Ihrer Ausgabe zu verarbeiten, wie Sie Ihre HTML minifing.
Sie können eine Middleware hinzufügen, die die Antwort abfängt, bevor sie in die Ausgabe geschrieben und minimiert wird.
So können Sie verwenden:
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);
});
Wenn Sie Ihre Middleware in verschiedenen Anwendungen teilen oder von anderen, können Sie eine Middleware erstellen möchten, und verwenden Sie es eher wie:
app.UseMiddleware<HtmlMinifierMiddleware>();
Das erledigt die ganze Arbeit für Sie mit einer einzigen Codezeile in der configure-Methode. Es ist üblich, Erweiterungsmethoden wie app.UseHtmlMinifier()
zu versenden und bestimmte Objekte zurückzugeben, die zur Konfiguration oder zur Unterstützung von Konfigurationsparametern verkettet werden können. Mit Erweiterungen viel Flexibilität bietet, Lesbarkeit und api Auffindbarkeit: D
jetzt vorstellen, Middleware so etwas wie dieses delcared ist:
public class HtmlMinifierMiddleware {
public HtmlMinifier(IHtmlMinifier minifier) {
// ...
}
public string Minify(string content) {
return minifier.Minify(content);
}
// ...
}
wie Sie sehen können, können Sie einen IHtmlMinifer geben müssen, so müssen Sie um es für die DI zu registrieren.
services.AddScoped<IHtmlMinifier, MyCoolHtmlMinifier>();
jetzt vorstellen, Sie brauchen nicht mehr als 1, aber viele Abhängigkeiten hat, wird es an den Entwickler/Verbraucher der Middleware jede einzelne Abhängigkeit zu wissen, dass sein muss:
dies auf ConfigureService wie erreicht Eingetragen.
Autoren von Middleware liefert normalerweise eine Erweiterung, um die Verwendung von Entwicklern wie: services.AddHtmlMinifier()
zu erleichtern, was genau das ist, eine Erweiterungsmethode für Registerdienste in den DI-Container.
Auch wenn Sie keine Middleware verwenden, können Sie die Abhängigkeit Ihrer eigenen Anwendung mit demselben Muster nutzen.
Zum Beispiel, wenn Ihre Anwendung ein E-Commerce ist, können Sie Erweiterungsmethoden erstellen, die Ihre Abhängigkeiten registrieren: services.AddProductManagement()
, services.AddPriceCalculator()
, services.AddSearching()
, etc, OR services.AddMyCoolApplication()
nur eine saubere Art und Weise der Zugabe zu bieten (Registrierung) Ihre Dienste (Abhängigkeiten) vom DI Container für Ihre Anwendung gefunden werden.
der Link war sehr hilfreich, danke – wodzu