Site icon Blog ARC Optimizer

Blazor, êtes-vous prêt? – Blogs parfaits


Introduction

Création de SPA

Ces dernières années, j'ai participé à plusieurs projets d'application Web implémentés en tant qu'application d'une seule page (SPA) avec une interface API REST vers le backend. Dans tous ces cas, le SPA a été construit avec React et le modèle de conception Flux / Redux. Étant donné que mon expérience est fortement centrée sur .NET et Azure, l'API est généralement construite avec .NET Core. En raison des différences technologiques entre le SPA et l'API, React étant basé sur JavaScript / TypeScript dans le navigateur et .NET Core étant basé sur C # dans le cloud, un changement de contexte est toujours nécessaire lorsque vous travaillez dans les deux. (J'ai tendance à être plus backend mais aussi à m'intégrer à l'interface utilisateur à l'occasion.)

Entrez Blazor!

Blazor m'a enthousiasmé quand il est apparu avec la promesse d'unifier la base de code de l'interface utilisateur à l'API. Maintenant que .NET 5 amène Blazor à maturité pour des projets du monde réel, je suis prêt à me lancer. Alors, Blazor est-il prêt? Êtes-vous prêt?

En me basant sur notre expérience dans la création de ces applications Web avec React, je veux décrire dans quelle mesure Blazor s'intègre dans ces domaines clés:

  • SPA Design Pattern
  • UI Models and using the API
  • Validation and Forms
  • Composants
  • Sécurité
  • Journalisation et analyse
  • Localisation

Modèle de conception de SPA

React et Redux

Redux et React sont devenus des incontournables lors de la construction d'un SPA. Le conteneur d'état prévisible fourni par Redux et la capacité de gérer cet état via des actions et des réducteurs sont primordiaux. Redux a été spécialement conçu pour bien fonctionner avec React liant l'interface utilisateur en tant que fonctions de votre état, en la mettant à jour en réponse aux actions.

Fluxor for Blazor

Avec Blazor, le même modèle de conception est préféré. Flux (de Facebook) est le modèle de conception sur lequel Redux est basé. Ce modèle est fourni par Fluxor pour l'application Blazor. Les concepts d'un magasin géré avec des réducteurs, des répartiteurs et des actions existent tous en C # sans avoir besoin de beaucoup de code.

De plus, Fluxor inclut une extension de navigateur Redux DevTools (Chrome & Edge) qui facilite débogage en donnant accès à l'état actuel ainsi qu'à l'état antérieur dans une navigation chronologique. C'est un excellent outil pour voir ce qui se passe lorsque des actions se produisent dans l'interface utilisateur.

Voici un exemple de code d'une page Blazor simple utilisant l'état avec des actions de l'interface utilisateur et un répartiteur.

[19659006] Index.razor

Index.razor.cs (code-behind)

Références:

UI Models and using the API

Avec Fluxor, Blazor peut atteindre la parité avec React / Redux. Mais l’état de l’application devra être composé d’objets pour les différentes pages. De plus, les actions interagiront avec l'API via des routes. Les deux peuvent être accomplis en codant manuellement des classes C # pour les modèles et en mappant les points de terminaison de l'API. En pratique, il existe un meilleur moyen, la génération de code.

NSwag

Pour React SPA, il est courant d’utiliser les outils NSwag pour générer des DTO et des actions à partir de l’API basés sur la spécification OpenAPI. Cela se fait avec les actions PostBuild pour le projet API .Net Core. Avec une solution React, ceux-ci généreront TypeScript. La génération de code s'applique également à Blazor, mais elle créera des classes C #.

Exemple d'actions PostBuild

La première commande crée la spécification OpenAPI swagger.json à partir de les contrôleurs de l'API. Le second crée un client C # avec une classe DTO et une classe «proxy» utilisant HttpClient pour exécuter des appels vers toutes les routes API avec les types de requête et de réponse appropriés. Ceci est idéal pour React et Blazor puisque le code d'interface utilisateur réel peut désormais référencer les DTO dans le magasin d'état et avec les actions nécessaires.

One Model

] Accélérez votre intranet SharePoint avec Rise

Découvrez comment tirer le meilleur parti de votre investissement dans Office 365 avec Rise, l'offre Intranet-as-a-Service de Perficient en réduisant la durée de votre projet intranet avec des solutions prêtes à l'emploi, en diminuant le risque de votre projet et l'augmentation de la valeur de votre intranet.

Obtenir le guide

Un inconvénient des DTO générés ci-dessus est la duplication des modèles existants dans l'API (domaine de la solution). Contrairement à React utilisant TypeScript, Blazor utilise du code C # .Net natif. Cela apporte la promesse d'unifier la base de code à la réalité! Désormais, la génération de code NSwag peut être modifiée pour ne pas créer de classes DTO (il suffit de créer le proxy HttpClient) et plutôt référencer une bibliothèque de classes de modèles de domaine contenant les mêmes classes de modèles que celles utilisées par l'API.

Références:

Validation and Forms

Règles de validation

Maintenant que le projet d'interface utilisateur Blazor utilise les mêmes modèles de domaine que l'API, l'interface utilisateur peut également exploiter une logique commerciale et de validation commune. Cela peut être fait simplement avec DataAnnotations avec les modèles de domaine. Avec React, une validation côté client similaire nécessiterait un code séparé et redondant.

Exemple de modèle avec DataAnnotations

Forms

Blazor développe également le modèle et l'utilisation de la validation avec Forms . En utilisant les composants de formulaire au lieu de simples composants de l'interface utilisateur, la validation sera automatiquement effectuée et les résultats seront affichés dans un composant de synthèse. L'exemple ci-dessous montre la même page d'index simple en utilisant un formulaire.

Index.razor without form

Index.razor en utilisant le formulaire

Références:

Composants

React et Blazor sont tous deux des frameworks d'interface utilisateur orientés composants, ce qui signifie que vous pouvez composer une page de composants. Les composants peuvent être simples, complexes, prêts à l'emploi, 3 rd ou personnalisés. Ceci est idéal pour la réutilisation et la cohérence entre une seule application ou au-delà d'une organisation.

Bibliothèques de composants

Blazor est plus jeune que React et certaines autres solutions d'interface utilisateur SPA, mais il mûrit rapidement avec de nombreuses 3 rd les parties ont fourni des bibliothèques de composants. Celles-ci vont des plus petites collections open source aux grandes offres commerciales. Indépendamment des exigences de l'application, il est probable qu'il existe des composants Blazor à utiliser qui éliminent le besoin de créer les vôtres.

Exemples de bibliothèques:

  • Blazored
  • Blazorise
  • DevExpress Blazor Components
  • MatBlazor
  • MudBlazor
  • Composants Radzen Blazor
  • Interface utilisateur Telerik pour Blazor

Composants personnalisés et bibliothèques:

Les composants Blazor peuvent être créés à partir de zéro et peuvent encapsuler d'autres composants. Ceux-ci utilisent la même syntaxe de rasoir et le même code C # auxquels nous sommes habitués. Celles-ci peuvent également être des packages dans une bibliothèque pour être partagés et / ou publiés via nuget si nécessaire.

Sécurité

Jusqu'à présent, je me suis concentré sur les problèmes d'interface utilisateur puisque Blazor est tout au sujet de l'interface utilisateur. Cependant, en tant qu'architecte de solutions, je m'en voudrais de ne pas aborder certaines des préoccupations transversales importantes. Le plus important serait la sécurité. La sécurité pour un SPA est également devenue quelque peu standard (comme l'utilisation de React / Redux / API). Cette approche typique consiste à utiliser OpenID Connect (OIDC) qui est basé sur le protocole OAuth 2.0.

Autorisation

Une autorisation peut être demandée pour l'application Blazor entière ou au niveau de la page. Les deux cas appliquent l '@attribute [Authorize] comme indiqué ci-dessous.

Autorisation au niveau de l'application via _Imports.razor

[19659027] Autorisation au niveau de la page via Index.razor

Authentification

Blazor inclut la bibliothèque d'authentification qui fournit une authentification basée sur des jetons basée sur des jetons Web JSON (JWT). La bibliothèque d'authentification fournit une authentification transparente avec les backends ASP.NET Core et intègre ASP.NET Core Identity avec l'autorisation d'API.

La sécurité est un sujet plus vaste que ce que cet article ne permet, mais Blazor est bien placé pour prendre en charge les besoins d'un backend SPA authentification et autorisation de l'interface utilisateur. Pour plus de détails, reportez-vous à la référence ci-dessous.

Références:

Journalisation et analyse

Comme pour le reste de l'application, l'interface utilisateur de Blazor peut bénéficier de l'inclusion du traçage des informations et des exceptions après le déploiement. En outre, l'interface utilisateur dépendra probablement d'une analyse de l'utilisation. Heureusement, ces problèmes ont des solutions.

Journalisation

Dans ma récente expérience avec React SPA, Application Insights a été utilisé dans le front-end pour fournir des moyens de retracer les informations et les exceptions initiées dans le code TypeScript. La même chose peut être faite avec l'application Blazor via le package nuget répertorié ci-dessous. Il est intéressant de noter qu'à l'heure actuelle, cela est fourni par un tiers rd et non par Microsoft. Cela peut changer à l'avenir. Cependant, tel qu'il existe, le package fournit les capacités nécessaires pour suivre les traces, les exceptions et les métriques. Il fournit également un suivi des mesures basé sur le temps.

Analytics

De même, Google Analytics s'est avéré être un ajout précieux aux applications React SPA. De même, la même chose peut être faite avec une application Blazor et le package nuget répertorié ci-dessous. Lorsqu'il est utilisé, GA suivra les événements par défaut et peut être explicitement appelé via le code si nécessaire.

Références:

Localisation

La ​​localisation n'est pas toujours une exigence pour chaque application, mais quand elle est avec .Net Core là est généralement une utilisation de IStringLocalizer pour effectuer des traductions. Blazor prend entièrement en charge ce côté client ainsi que pendant les appels d'API. Cela permet aux itinéraires d'API de localiser la réponse de contenu selon les besoins de la culture / langue de l'utilisateur, de la même manière qu'un React SPA le ferait. Cela permet également la traduction du code côté client si nécessaire.

Références:

Résumé

Blazor est là! Blazor est prêt! Je suis tout excité! Blazor est plus récent dans le paysage SPA, mais coche de nombreuses cases à choisir dans le cadre de la solution. Il y a des zones (principalement en raison du temps plus court sur scène) où il est en retard sur React. Cependant, il existe des domaines clés qui, bien qu'ils soient relativement nouveaux, dépassent React – modèles, validation, unité de base de code pour n'en nommer que quelques-uns. Donc, à mon humble avis, si votre plate-forme et / ou votre expérience est .Net Core, Blazor est un OUI pour la prochaine application Web.

À propos de l'auteur

Gary Brandt est un architecte de solutions principal spécialisé dans la conception, le développement et le développement de solutions personnalisées. livraison utilisant la plate-forme Microsoft et les services cloud Azure. Il a plus de 20 ans d'expérience dans le développement et le conseil et a vu de nombreuses technologies différentes au fil des ans. Il est toujours enthousiasmé par les changements émergents et de voir comment ils auront un impact sur le travail que nous faisons aujourd'hui et dans le futur. s) {if (f.fbq) return; n = f.fbq = function () {n.callMethod?
n.callMethod.apply (n, arguments): n.queue.push (arguments)}; if (! f._fbq) f._fbq = n;
n.push = n; n.loaded =! 0; n.version = '2.0'; n.queue = []; t = b.createElement (e); t.async =! 0;
t.src = v; s = b.getElementsByTagName (e) [0]; s.parentNode.insertBefore (t, s)} (fenêtre,
document, 'script', 'https: //connect.facebook.net/en_US/fbevents.js');

fbq («init», «911436665572720»);
fbq ('track', "PageView");




Source link
Quitter la version mobile