Tout comme les Xamarin.Forms Prism évolue, ce 7ème volet de notre étude va aborder les nouveautés de la version 7 à venir…
Articles précédents
Avant d’aborder le sujet du jour, rappelons ce que nous avons vu jusqu'à maintenant :
- Partie 1, une présentation générale de Prism et divers liens vers d’autres articles
- Partie 2, Créer un projet, la connexion des Vues et des ViewModels…
- Partie 3, le système de gestion des commandes
- Partie 4, La navigation
- Partie 5, L’Event Aggregator (messagerie MVVM)
- Partie 6, Le service de Dialogue
L’essentiel à savoir sur Prism a donc été vu, mais dans cette 7ème partie je vais vous présenter les nouveautés de la 7ème version qui sortira peut-être en ce joli 7ème mois de l’année… Je laisse aux symbolistes le soin d’interpréter ces trois 7 à leur guise tout comme je laisse aux complotistes le loisir de noter que 777 c’est juste 666 + 111 ! Diantre ça fiche les jetons !
.NET Standard
Je vous ai déjà parlé de .NET Standard, cette API qui se place au-dessus de tous les .NET pour les unifier. Cibler .NET Standard c’est s’assurer d’avoir un code portable sans s’embarrasser du casse-tête que sont les fameux “profils .NET” portant des numéros de code tout aussi impénétrables que la logique qu’ils sous-tendent…
Pour ceux qui n’auraient pas tout suivi, voici quelques liens vers les principaux articles où j’évoque .NET Standard :
Le dernier lien vous permettra aussi de faire le point sur .NET Core qui ne doit pas être confondu avec .NET Standard !
Prism 7
Une fois toute cette saine et édifiante lecture ingurgitée je vous sens chaud bouillant “Mais diable quelles sont les nouveauté de ce satané Prism 7 !”.
Une fois posé ce qu’est .NET Standard et son intérêt on sait que son adoption dans les différentes options de développement prennent un certain temps, mais tous les outils finissent par s’aligner et c’est le cas de Prism 7.
La première nouveauté de la version 7 est donc d’être une librairie non plus de type PCL avec un profil .NET mais d’être .NET Standard.
Cela n’a l’air de rien, mais c’est une évolution majeure vers une convergence qui désormais s’étend à l’unification de tous les .NET par le biais d’une API commune, de WPF à Core en passant par UWP ou Xamarin.
Bien entendu la V7 est disponible via Nuget et peut s’installer aussi simplement qu’avant. Toutefois nous savons tous qu’il existe des évolutions ou des corrections dans toute librairie et qu’il est parfois nécessaire d’attendre assez longtemps une nouvelle version dite “officielle” avant de bénéficier de ces modifications. L’autre solution consiste à intégrer directement le projet GitHub de la librairie dans son propre projet mais ce n’est déjà plus aussi pratique qu’un package Nuget.
Une troisième voie existe, celle de MyGet. Prism 7 marque ainsi son entrée dans le système de feed MyGet qui est relié aux builds les plus récents. De fait quand une nouvelle fonctionnalité est ajoutée ou lorsqu’une correction importante est effectuée vous pouvez en disposer rapidement sans avoir à intégrer les sources du projet.
L’adresse du feed de Prism est : https://www.myget.org/F/prism/api/v3/index.json
Certes il s’agit plus de plomberie que de nouveautés croustillantes mais c’est déjà beaucoup tant le support de .NET Standard et l’intégration au feed de MyGet peuvent simplifier la vie du développeur.
On notera aussi qu’avec le support de Xamarin.Forms 2.3.5 Prism 7 devient utilisable dans les applications MacOS. Du C# avec MVVM pour créer une application Mac, combien d’entre nous en ont rêver depuis des années ? La question est de savoir si cela est aussi intéressant qu’on le fantasmait. Ou si cela a réellement eu une véritable importance un jour… Tout dépend du niveau d’Apple-mania de chacun ! Mais même pour les plus réfractaires il convient d’admettre que cette grande convergence qui en marche est un progrès.
Les différences avec la version 6
Outre ce que je viens de dire il existe tout de même des différences notables par rapport à la dernière version 6 (la 6.3).
Navigation & Plateforme
Vous savez que Xamarin a entrepris de réviser OnPlatform depuis la version 2.3.4. Au pris de l’utilisation de “chaînes magiques”, des strings qu’ont doit tester à l’identique dans un switch. Cela étend bien entendu le OnPlatform original qui était dans l’esprit limité à Android, iOS et Windows Phone. Ce dernier a cédé la place à UWP, MacOS vient s’ajouter, etc, la façon de code cette méthode utilitaire devait être revisité. L’utilisation de chaînes à l’avantage du découplage et de l’ouverture à tous les possibles sans avoir à remodifier le code. Mais je n’aime pas les chaînes magiques. C’est une source d’erreur trop grande, une passoire à bogue dans un édifice si bien typé et contrôler. Comme un mot de passe bétonné qu’on laisse écrit sur un post-it collé à l’écran en gros…
Prism 7 met à jour le IDeviceService qui fournit un nouveau RunTimePlatform sous la forme d’une Enum. Donc plus de chaînes magiques. Cela rend le code plus propre et plus lisible. On peut par exemple s’en servir de la sorte :
Container.RegisterTypeForNavigationOnPlatform<MainPage, MainPageViewModel>("Main",
new Platform<MainPage_Android>(RuntimePlatform.Android),
new Platform<MainPage_iOS>(RuntimePlatform.iOS));
Dans le même esprit on note que la présence de RegisterTypeForNavigationOnPlatform avec de nouvelles extensions. L’ancienne signature réclamait des paramètres de plateforme explicites, la nouvelle version accepte tout objet supportant IPlatform.
Pour ceux qui ne connaissent pas cette méthode de Prism vous aurez compris je suppose que le but est d’enregistrer des pages XAML dans la navigation en fonction de la plateforme sur laquelle est exécuté le code. Dans cet exemple la clé “Main” est associée pour la navigation aux pages MainPage_Android et MainPage_iOS qui sont transformées en objet IPlateform. A l’exécution, en navigant vers “Main”, la page spécifique à la plateforme sera automatiquement affichée par Prism.
Il s’agit là encore de fonctionnalités qui peuvent paraître très techniques, assez peu exaltantes en elles-mêmes. Ne vous y trompez pas, dans une vraie App de telles avancées cross-plateformes font gagner beaucoup ! A commencer par un code autrement plus clair et plus simple à maintenir. Et comme je n’ai cessé de le répéter depuis toujours, un code pro c’est avant tout un code maintenable. A mon sens nous avons donc ici affaire à des améliorations majeures de Prism.
CanExecute et observation automatique de propriétés
Dans l’une des parties précédentes sur Prism je vous ai présenté cette astuce incroyable de Prism qui permet de déclarer automatiquement dans une commande la dépendance à l’état d’une propriété par le biais de DelegateCommand.ObservesProperty.
Cela restait limité malgré tout à une propriété de “premier niveau” d’un objet donné. Grâce d’ailleurs à une contribution de la communauté qui a été validée dans Prism 7 il est désormais possible d’accéder aussi par cette syntaxe aux sous-propriétés d’un objet (si elle est prise en compte dans le mécanisme d’INPC de son objet bien entendu). On peut ainsi écrire :
ObservesProperty(() => Property.NestedProperty.NestedPoperty);
Exceptions durant la navigation
Jusqu’à maintenant le service de navigation “gobait” les exceptions qui arrivaient durant une navigation ce qui rendait le debug particulièrement ardu dans un tel cas. La version 7 logue l’erreur et fait ensuite un re-throw ce qui permet un débogue simplifié.
Prism pour UWP
Prism pour UWP n’est pas exactement le même que Prism pour les Xamarin.Forms, mais il faut savoir qu’à partir de la version 7 (évolution qui concerne toutes les versions) l’équipe de Prism a commencé à séparer totalement les packages concernant les conteneurs IOC ce qui permet de corriger l’un sans updater les autres s’ils n’ont pas de problème. Donc sous Prism UWP il faut désinstaller Prism.{conteneur} pour installer Prism.{conteneur}.Windows.
Les autres avancées
Comme je le disais en titre de cet article la version 7 est “à venir” au moment j’écris cet article, le package Nuget officiel n’est pas encore disponible en version stable donc. Et il reste encore des choses sur lesquelles l’équipe de Prism travaille avant cette sortie officielle.
- Les QueryString de la navigation par URL sont déjà un système particulièrement puissant et simplificateur mais cela ne concerne pas les pages modales ni les onglets d’une page (à onglets…). L’équipe travaille pour la V7 à ajouter ces possibilités ce qui ferait du service de navigation de Prism le mécanisme le plus abouti de ce type.
- Prism Forms utilise le service de dépendances de Xamarin.Forms, ce qui est assez naturel au départ. Mais avec le IPlatformInitializer il n’y a plus besoin de se reposer sur le service de dépendances pour les types spécifiques à une plateforme donnée. Cela va simplifier un peu le code de Prism et éviter des mélanges entre différents moyens d’arriver au même résultat.
- Il est aussi question de pouvoir utiliser MVVM et son ViewModelLocator (qui reste un peu caché dans Prism mais qui existe) avec des Views personnalisées tout comme il est déjà possible de le faire avec des Pages Xamarin.Forms.
Conclusion
Prism pour les Xamarin.Forms, appelé souvent par l’équipe “Prism Forms”, est une librairie MVVM aussi light que Mvvm Light mais bien plus puissante notamment au regard des différents services fournis (navigation, dialogue…). Son utilisation totalement repensée pour les Xamarin.Forms rend Prism réellement léger, facile à aborder et à utiliser.
Jusqu’aujourd’hui j’ai toujours conseillé d’utiliser Mvvm Light lorsque les équipes de dev n’étaient pas assez homogènes. Il est en effet préférable d’avoir un support MVVM compris par tous même s’il est rudimentaire que de vouloir utiliser des systèmes plus sophistiqués que les devs de moins bon niveau ne maîtriseront pas ce qui entraînera la production de mauvais code difficile à maintenir.
Sous Xamarin.Forms, avec l’avènement d’un Prism Forms parfaitement taillé pour rester simple tout en étant très complet mon conseil est différent et je dois avouer que ma préférence va désormais à Prism Forms.
J’espère que cette saine émulation titillera Laurent, l’auteur de Mvvm Light, pour faire évoluer ce dernier (et enfin terminer un service de navigation digne de ce nom par exemple) car Mvvm Light reste une librairie bien faite disponible sous toutes les nuances de C#/Xaml ce qui simplifie le portage du code existant.
Mais miroir, Ô miroir magique, que me dis-tu ? .. Que c’est aujourd’hui Prism qui dans tout le royaume est le plus adapté et le plus complet…
Stay Tuned !