Avec la multiplication des plate-formes, les besoins en terme de partage de code sont de plus en plus importants. L’arrivée de Windows 8 et les applications Metro va générer beaucoup de portage d’applications existantes et la réutilisation du code devient alors capitale. Le sujet est assez complexe puisque les frameworks ne sont pas équivalents sur les différentes plateformes mais conservent malgré tout un sous-ensemble commun.
Le type de projet « Portable Library » permet justement de factoriser du code commun à plusieurs plateformes en donnant accès uniquement aux assemblies de base communes à celles-ci. On met tout le code commun dans cette librarie de classes qui est référencée par les projets spécifiques à chaque plate-forme et hop le tour est joué.
Rhhha mais c’est génial ça ! Ca va me sauver la vie ? Oui et non…
On sous-estime souvent les spécificités de la plateforme dans notre code et nous verrons qu’il peut être plus compliqué que prévu de conserver un code commun, au fil des 4 articles de la série:
- Partager du code entre plate-formes grâce à la Portable Library (1/4) - Partager du code entre plate-formes : l’application Windows 8 Metro (2/4) - Partager du code entre plate-formes : l’application Windows Phone (3/4) - Partager du code entre plate-formes : l’application Silverlight 5 (4/4)
- Partager du code entre plate-formes grâce à la Portable Library (1/4)
- Partager du code entre plate-formes : l’application Windows 8 Metro (2/4)
- Partager du code entre plate-formes : l’application Windows Phone (3/4)
- Partager du code entre plate-formes : l’application Silverlight 5 (4/4)
Retrouvez le code source des démos:
[Edit 31/05/2012] Le sujet du portage d’application depuis Windows Phone vers Windows 8 (et donc indirectement du partage de code entre plates-formes) a aussi été traité de manière très détaillée par Pierre Cauchois dans sa suite d’articles Stratégies et techniques de partage de code C# et XAML entre Windows Phone et Windows 8
La Portable Class Library existe déjà pour Visual Studio 2010 sous forme d’extension. Visual Studio 11 Ultimate intègre directement une version de la Portable Library supportant les applications Windows 8 Metro.
Pour l’utiliser, il faut créer un nouveau projet de type « Portable Class Library ».
Dans les propriétés du projet, vous pourrez choisir les plateformes sur lesquelles votre application doit pouvoir tourner.
En fonction des plateformes et des versions de plateformes sélectionnées, Visual Studio vous donnera accès aux librairies de base qui leur sont communes. Ainsi, plus vous sélectionnez de plate-formes, plus ce sous-ensemble sera restreint.
Voici un tableau qui détaille les fonctionnalités disponibles dans la Portable Library, sur les différentes plateformes :
Classiquement, on va retrouver
Les pages, le layout ainsi que cetains cas d’utilisation seront différents car les dimensions et l’usage de chaque device diffère :
L’idéal serait de partir vers une structure de ce type avec les couches communes en bleu :
En terme de structure de projets dans Visual Studio, on procéderait de la manière suivante avec un projet par plate-forme et un projet commun de type Portable Library:
Et les couches relatives (DAL/Model/ViewModel) seraient associées à des répertoires sur chaque plate-forme comme sur le schéma ci-dessus :
Malheureusement, la couche d’accès aux données (DAL) contient souvent du code spécifique à la plate-forme. Par-exemple, l’accès à un service OData nécessite un client WCF Data Service différent sur WP7, sur Silverlight et sur Win8 (où il n’existe pas encore), bien que le service soit le même côté serveur.
Dans ce cas, la DAL pourrait se retrouver dans la portable library sous la forme d’une interface, qui serait implémentée de manière différente sur chaque plate-forme:
namespace MyApp.Portable.DAL { public interface IDataProvider { event EventHandler<IEnumerable<DataItem>> DataLoaded; void LoadDataAsync(); void UpdateItem(DataItem item); void AddItem(DataItem item); void RemoveItem(DataItem item); } }
Comme on peut le voir dans le tableau plus haut, MEF est disponible pour certaines plate-formes dans la Portable Lib et peut donc nous aider à faire une gestion propre des règles d’implémentation.
Autre problématique: à ce jour les projets Windows Phone sont développés avec Visual Studio 2010 et il faudra donc 2 solutions : l’une sur VS2010 avec le projet Windows Phone, l’autre sur VS11 avec le projet Win8 Metro et Silverlight. La librairie commune – créée dans VS11 pour choisir la plate-forme Win8 - se retrouvera dans les 2 solutions.
Il est néanmoins possible d’utiliser la Portable Class Library dès aujourd’hui, ce qui peut être intéressant si vous souhaitez conserver une structure commune et surtout pouvoir assurer une maintenance homogène de votre application sur les différentes plate-formes.
Je vais partir sur une application toute simple qui récupère des données depuis un service OData et les affiche à l’écran. Le but est de montrer comment réutiliser du code dans ce contexte et il faut extrapoler ce principe pour une application plus conséquente, sinon cela n’a pas vraiment d’intérêt car très peu de code sera finalement partagé dans mon exemple.
L’application démo va présenter une liste de vins avec leurs photos. Je récupère ces données depuis un service OData qui se trouve à cette adresse : http://caveavins.cloudapp.net/CaveAVinsDataService.svc/Wines et je les affiche à l’écran.
Pour la démo je mettrai en oeuvre l’application sur 3 plate-formes:
Je vais donc créer 2 solutions : l’une sous Visual Studio 11 beta qui contiendra 3 projets:
- La portable lib - L’application Windows 8 Metro - L’application Silverlight 5
- La portable lib
- L’application Windows 8 Metro
- L’application Silverlight 5
L’autre sous Visual Studio 2010 qui contiendra 2 projets:
- La portable lib - L’application Windows Phone
- L’application Windows Phone
Voici le code source complet des applications:
La suite : Partager du code entre plate-formes : l’application Windows 8 Metro (2/4)
Hello,
Ces articles correspondent tout à fait à ce que je cherche à faire !!!
Donc un grand merci ;)
J'aurais une question concernant la PCL. Je réfléchis à mettre des ressources qui sont communes aux X applications comme les traductions (Via fichier resources) et j'ai aussi des images comme des drapeaux de pays.
Je suis parti sur des ressources embarquées mais je ne sais pas trop comment y accéder (Surtout les images) et je me demande si c'est une bonne pratique ?
Pourriez-vous m'aiguiller sur ce sujet ?
Merci