Prenons un exemple de middleware très simple qui est le WelcomePageMiddleWare
. Si nous voulons l'utiliser, nous devons ajouter la ligne app.UseWelcomePage()
à la méthode Configure
de la classe Startup
. En se faufilant dans le code source du noyau ASP.NET, j'ai trouvé que la méthode UseWelcomePage()
est une méthode d'extension sur IApplicationBuilder
comme indiqué ici: https: // github. com/dotnet/aspnetcore/blob/A450CB69B5E4549F5515CDB057A687771F56CEFD7/src/middleware/Diagnostics/SRC/BienvenuePage/WelcomePageExtensions.cs # L79
Cette méthode appelle une autre méthode d'extension: app.UseMiddleware<WelcomePageMiddleware>();
et UseMiddleware<T>
is une autre Méthode d'extension.
Question: Pourquoi avons-nous ces deux niveaux? Pourquoi ne pas simplement avoir une seule méthode d'extension sur le IApplicationBuilder
contenant le tout Mise en œuvre?
Pourquoi ne pas simplement avoir une seule méthode d'extension sur le
IApplicationBuilder
contenant l'ensemble de la mise en œuvre?
Fondamentalement, c'est ce que la première méthode d'extension fait, vous êtes obligé dans ce cas de passer à travers le WelcomePageOptions
contenant l'ensemble de la mise en œuvre ou au moins tous les arguments facultatifs.
public static IApplicationBuilder UseWelcomePage(this IApplicationBuilder app, WelcomePageOptions options)
{
if (app == null)
{
throw new ArgumentNullException(nameof(app));
}
if (options == null)
{
throw new ArgumentNullException(nameof(options));
}
return app.UseMiddleware<WelcomePageMiddleware>(Options.Create(options));
}
En fin de compte, il appelle la méthode d'enregistrement Owin UseMiddleware
qui vous oblige à savoir La syntaxe de mise en œuvre spécifique et les types requis Types car UseMiddleware
Accepte un nombre non clair et non spécifié d'arguments via le paramètre params object[] args
. Vous pouvez appeler cet enregistrement Owin vous-même, mais sans la validation de type Votre exécutez le risque d'erreurs d'exécution lorsque vous passez des options incompatibles.
La méthode d'extension est une aide qui valide et applique les types d'entrée spécifiques et améliore la lisibilité naturelle du code. Que seul est une raison suffisante pour utiliser les méthodes d'extension mais cela le fait Discouvable via IntelliSense qui nous aide à consommer rapidement middleware sans avoir besoin de savoir quelles sont toutes les options possibles.
Ajout de middleware comme méthode d'extension à IAPPBuilder
compréhension et création de Owin Middlewares - Partie 1
[.
Les 3 autres extensions dans welpertpageExtensions.cs Offrez des implémentations communes pour réduire le code de la plaque de chaudière que vous pourriez écrire et finalement mal.
Chaque ligne de code J'écris Pour consommer Les assemblages de quelqu'un d'autre a le potentiel d'échouer, mais ce sera [~ # ~] My [~ # ~ ~] Défaut. Un bon auteur auteur fournira des options de mise en œuvre différentes qui conviennent aux modes de compatibilité standard afin que les appelants soient moins probables. faire des erreurs stupides.
UseWelcomePage(this IApplicationBuilder app, PathString path)
PathString
est un concept aspnetcore qui encapsule la gestion de l'échappement, du traitement ou de la construction de chaînes d'URI, pour un noyau pur ASP.NET CORE CodeBase, c'est le moyen standard de définir un moyen de définir un non évalué route vers une ressource.
UseWelcomePage(this IApplicationBuilder app, string path)
Le chemin dactylographié à la chaîne est fourni pour Lazier implémentations (OMI) ou codesbases migrées de ASP.NET. Ces deux surcharges couvrent la plupart des cas d'utilisation pour l'accueil.
La dernière extension de cette classe est une surcharge simple qui vous permet d'omettre complètement les options de configuration.
UseWelcomePage(this IApplicationBuilder app)
Ce style de surcharge de la méthode d'extension, au lieu de faire le paramètre de configuration Facultatif est préféré dans ce cas car il existe déjà plusieurs surcharges avec le même nom. Le mélange des surcharges et des paramètres facultatifs peut faire la résolution de laquelle la méthode d'exécution ambiguë, de sorte que la structure de conception, utilise une technique, pas à la fois. Ce thread de commentaire est un exemple des discussions qui continuent si vous obtenez la balance erronée: https://thedailywtf.com/articles/commentes/extending-yourf
Les méthodes d'extension sont utilisées de cette manière tout au long du cadre, non seulement au middleware, il permet à l'auteur de la fonctionnalité souhaitée d'écrire une seule méthode avec les paramètres optimaux pour obtenir le travail effectué ou comme dans le cas du middleware, nous sommes forcés. exposer des prototypes non typés ou génériques conformes à des interfaces spécifiques ayant une utilisation ambiguë.
Les extensions d'emballage sont ensuite ajoutées pour faciliter la découverte de la fonctionnalité ou l'utiliser dans différents contextes sans forcer l'utilisateur final à lancer leurs variables actuelles dans ce qui pourrait sembler exotique Types qui pourraient alors être passé à travers des paramètres non typés (object
).
Ce modèle émerge également lorsque de nouvelles versions du cadre améliorent la fonctionnalité principale, mais elles souhaitent maintenir la compatibilité en arrière avec la sortie de types de type.
Pour plus d'arrière-plan sur le modèle de méthode d'extension en général, ont une lecture en lecture méthodes d'extension Meilleures pratiques sur le devblog VB.