Cloudy Pizza : une application Silverlight 3 .NET RIA Services indexable dans les nuages !
Pour ceux qui ont assisté aux Microsoft Days 2009 (que ce soit à Paris ou en région) aux sessions plénières ou aux sessions sur le cloud computing, vous avez pu découvrir ma magnifique application nommée “Cloudy Pizza”. Sous un air pas très sérieux, je me suis en fait amusé à inclure pas mal de notions intéressantes. Je vous propose ainsi de voir ensemble l’ensemble des fonctionnalités que j’ai mis en place et nous essaierons au travers de prochains billets de voir en détail comment les implémenter.
MISE A JOUR Janvier 2010 : vous trouverez le code source en l’état à la fin de ce billet. C’est le code source que j’ai utilisé dans cette session des Microsoft Days que vous pouvez voir en vidéo.
Voici en vrac ce que j’ai mis dedans: application Silverlight 3 SEO Friendly (indexable par les moteurs de recherches), .NET RIA Services connectée à une source SQL Azure, hébergement dans Windows Azure, utilisation de Membership Provider ASP.NET branchés sur le storage Azure, écriture du code en suivant le pattern MVVM (Model View View-Model) et framework de pages dynamiques en fonction du statut de l’authentification. Pour terminer, lorsque l’on commande une pizza (vous pouvez le faire en vous créant un compte sur mon application), une ressource est réservée sur Exchange Online (faisant parti de la suite BPOS pour Business Productivity Online Suite) et un email de confirmation vous est envoyé. L’idée est venue de Damien Caro qui souhaitait pouvoir utiliser Exchange Online pour réserver automatiquement un parc de motos/mobylettes pour les livraisons. Ensuite, les livreurs de pizzas reçoivent automatiquement les commandes à livrer sur leur mobile synchronisé à Exchange. Il m’a donc aidé à écrire le code sur cette partie.
Liens directs vers les sections :
1 - Une application Silverlight 3 indexable par les moteurs de recherches ?
2 - Un hébergement dans le cloud pour répondre à la charge de manière élastique
3 - Quels sont les impacts d’Azure sur le développement ?
4 - Des pages dynamiques en fonction du rôle et du niveau d’authentification
5 - L’utilisation d’Exchange Online via ses WebServices
6 - M-V-VM ?
Vous pouvez tester l’application en live ici : --> https://cloudypizza.cloudapp.net <--
Une application Silverlight 3 indexable par les moteurs de recherches ?
Bien sûr ! Je suis en fait parti du sample “Silverlight Store” qui jette les bases de la construction d’une application Silverlight 3 indexable par les moteurs de recherches. Cela consiste en fait à utiliser la productivité amenée par .NET RIA Services pour nous aider à :
- générer un contenu alternatif en HTML via ASP.NET
- générer facilement le robots.txt et sitemap.aspx utilisés par les moteurs de recherches
- coupler la même URL à 2 expériences différentes : ASP.NET ou Silverlight 3. Pour cela, on utilise intelligemment le moteur de routing d’ASP.NET avec celui de Silverlight 3.
Le sample Silverlight Store était basé sur un contenu XML. Je me suis donc simplement occupé de le transformer pour me connecter à une source SQL Server puis SQL Azure. Le passage de SQL Server à SQL Azure étant particulièrement simple puis qu’il a fallu uniquement changer ma chaîne de connexion pour que mon modèle Entity Framework se mette à discuter avec SQL Azure plutôt avec mon instance locale SQL Express 2008.
Alors comment ça marche? L’idée est de partir d’une master page ASP.NET dans laquelle on inclut la référence à notre application Silverlight. Ainsi, 2 routes s’offrent aux navigateurs lorsque l’on se connecte sur le site sur la même URL:
- Route 1 : le plug-in Silverlight n’est pas installé ou pas supporté par le navigateur (iPhone par exemple), on affiche alors un contenu HTML
- Route 2 : le plug-in Silverlight est disponible, on bascule sur l’expérience riche RIA
Par exemple, prenez le cas de cette URL complète : https://cloudypizza.cloudapp.net/Pizza.aspx?Name=Pizza+des+indecis
Avec le plug-in Silverlight 3 activé, vous noterez 2 choses:
- vous arrivez directement sur la bonne fiche produit. Le framework de routing d’ASP.NET a donc passé la main au moteur de navigation de Silverlight pour que ce dernier aille directement sur le produit “Pizza des indecis”
- l’URL n’a rien de spécifique à Silverlight
Du coup, si on désactive le plug-in Silverlight, on arrive sur ce type de contenu:
Contenu parfaitement compréhensible par un moteur de recherche! Par ailleurs, cela a également l’avantage de proposer un rendu alternatif de qualité aux navigateurs ne supportant pas encore Silverlight.
De plus, pour aider les moteurs de recherches, vous pouvez analyser le contenu produit par ces 2 URLs: https://cloudypizza.cloudapp.net/robots.txt & https://cloudypizza.cloudapp.net/Sitemap.aspx. Le sitemap étant généré dynamiquement en fonction du catalogue produit présent dans notre base de données bien sûr. Pour cela, on utilise un contrôle répéteur d’ASP.NET branché sur le contenu de la base via .NET RIA Services.
Ainsi, une fois ce travail proprement effectué, vous pouvez effectuer des recherches dans votre moteur de recherche préféré pour retrouver mes pizzas si appétissantes. Par exemple, sur Google : https://www.google.com/search?hl=fr&source=hp&q=pizza+des+jedis, 1er hit pour la pizza des jedis ! Je suis super fier ! :) (je sais, il peut apparaître bizarre d’être fier de ce genre de chose). Pareil sur Bing : https://www.bing.com/search?setflight=0&mkt=fr-fr&q=pizza+frdpe
Pour terminer sur ce chapitre, si l’indexation d’applications Silverlight 3 vous intéresse, nous avons travaillé sur la rédaction d’un livre blanc avec notre partenaire Referencement.com que vous pouvez récupérer ici.
Un hébergement dans le cloud pour répondre à la charge de manière élastique
Qu’est ce que le cloud computing en quelques mots? C’est la mise à disposition d’une plateforme de services (PaaS ou Platform as a Service) sous la forme de Data Centers répartis sur la planète vous offrant principalement 2 caractéristiques :
1 – Héberger ou exécuter votre application (.NET ou PHP) sur des serveurs maintenus, mis à jour, répliqués, géo-localisés (Amérique du nord, Europe, Asie) et sécurisés par un opérateur (Microsoft dans le cas de Windows Azure). Vous n’avez donc plus à vous soucier de la maintenance et de la disponibilité des serveurs hébergeant vos applications.
2 – Capable de supporter une forte montée en charge en vous mettant à disposition un nombre conséquent de machines sur lesquelles vous pouvez déployer rapidement et très facilement votre application. De manière analogue, cette plateforme vous permet également de facilement dé-provisionner les machines que vous vous êtes alloués. C’est ce que l’on appelle l’élasticité : pouvoir suivre de manière très fine la courbe de charge de votre application.
Voici ainsi 2 illustrations issues du futur coach MSDN sur Windows Azure qui sera bientôt publié ici : https://msdn.microsoft.com/fr-fr/msdn.coach.aspx
Sur la 1ère, on voit la vue de l’utilisation d’un data center en fonction de la charge. On s’aperçoit alors que nous ne sommes jamais pleinement efficace sur l’utilisation des ressources allouées. Soit on a trop de serveurs sur les bras et ils deviennent sous-utilisés avec l’impact financier que cela comporte : frais de maintenance, administration, amortissement, etc. Soit on a pas assez de serveurs et l’application n’est plus capable de répondre à la charge : timeout et perte d’exploitation/business.
L’idéal serait donc de pouvoir dynamiquement s’ajuster à la charge mesurée sur notre application et donc de suivre de manière très fine cette courbe. C’est ce qu’il se produit avec la 2ème vue grâce à l’utilisation du cloud computing.
Dans le cas de Windows Azure, jetons un œil sur le portail d’administration où se trouve hébergée Cloudy Pizza :
On observe 3 choses particulièrement intéressantes liées à notre plateforme de cloud computing:
- un environnement de pré-production (Staging) disponible nativement nous permettant, pour très peu de frais, de tester la nouvelle version de notre application avant de la basculer en production vers la gauche via le bouton circulaire du centre.
- le nombre d’instances dédiées à chacun de nos environnements. Ici 1 instance pour la production et 2 instances pour la pré-prod
- la localisation géographique de notre application
Tentons maintenant de raisonner à travers des scénarios d’usage mettant en valeur cette élasticité.
Une pré-production efficace, réelle et pas chère
Imaginons un instant que vous soyez propriétaire d’un data center dans lequel vous hébergez votre application. Que faire pour mettre un place un environnement de pré-production ? Si l’on souhaite en effet être dans un environnement identique à la production, il faudrait potentiellement investir dans un 2ème data center dans lequel on pourrait sereinement tester la prochaine version ou mise à jour de l’application avant de basculer vers la production. L’avantage de la plateforme Windows Azure est que cet environnement de pré-production vous est proposé par défaut. Testez votre nouvelle application sur le nombre souhaité d’instances, validez que tout se déroule comme prévu et basculer en production. Une fois l’ancienne production inversée avec la pré-production, vous pouvez dé-provisionner les machines virtuelles de la version N-1. L’avantage? Vous n’aurez payé uniquement ce que vous aurez consommé pendant les phases de recettes/tests de la pré-production. Vous n’avez ainsi pas à maintenir et payer une pré-production “en dure” de manière systématique. Voici un des premiers avantage de cette fameuse élasticité.
Par ailleurs, la bascule entre la pré-production et la production est immédiate. C’est certainement loin d’être le cas si vous avez 2 data centers sous la main.
Une montée en charge réactive et facile
Prenons un exemple désagréable. Imaginons que vous soyez responsable de la mise en production du site de déclaration de l’impôts sur le revenu. Votre pic de charge se fera sans doute aux alentours du mois d’avril/mai où l’ensemble des contribuables vont se rendre sur le site pour effectuer leur déclaration. Il faut donc prévoir le coup en terme de capacité en provisionnant un ensemble de serveurs capables de prendre en charge le pic et éviter d’avoir des utilisateurs citoyens mécontents de l’inaccessibilité du service. Cependant, une fois le pic de charge passé, l’activité du site gérant les déclaration va devenir très faible le reste de l’année. En effet, nous n’avons pas trop tendance à traîner sur le site des impôts une fois la déclaration faite.
Cet exemple se prête en fait très bien à la notion d’élasticité. Nous utilisons aussi fréquemment l’exemple d’un site d’e-commerce lançant une opération de promotion (à Noël par exemple). La charge devient plus élevée sur les fêtes de fin d’année et baisse drastiquement au mois de Janvier.
La plateforme Windows Azure répond très bien à ce besoin. Pour augmenter ou diminuer le nombre d'instances (de machines virtuelles) que vous souhaitez allouer à votre application, il suffit de cliquer sur le bouton “Configure” et de changer le paramètre :
<Instances count="1" /> vers <Instances count="10" /> par exemple.
Quelques minutes plus tard, 9 nouveaux serveurs auront été automatiquement provisionnées, votre application aura été publiée sur ces nouveaux serveurs et le load balancing sera mis en place pour répartir les requêtes sur l’ensemble de ces 10 serveurs. Tout cela en ne changeant finalement qu’un simple compteur. De manière analogue, le “deprovisionning” est aussi simple à gérer. C’est donc bien cela qu’apporte cette PaaS : un ensemble de services pour vous faciliter la vie et vous faire gagner en efficacité.
La géo-localisation facilitée
Continuons à rêver et imaginons cette fois-ci que notre application rencontre un succès planétaire. Si l’on héberge notre application sur un data center en France, les clients asiatiques ou américains auront une expérience dégradée par rapport à la clientèle française. Comment alors gérer cette situation ? Il faudrait fabriquer et déployer un data center dans ces nouvelles zones géographiques, déployer notre solution sur ces nouveaux sites, maintenir ces serveurs et gérer la redondances des données.
A nouveau, ce scénario est nativement couvert par Windows Azure. Actuellement, 6 data centers sont prévus répartis sur la planète. La mise à disposition de notre application sur d’autres data centers sera donc aussi simple que l’augmentation du nombre d’instances : entièrement automatisée.
Combien ça coute ?
Le “business model” a été présenté cet été et est disponible ici : https://blogs.msdn.com/windowsazure/archive/2009/07/14/confirming-commercial-availability-and-announcing-business-model.aspx
3 métriques sont donc importantes à retenir : l’utilisation CPU, le stockage et la bande passante.
Vous verrez ainsi qu’il ne faut pas obligatoirement aujourd’hui partir sur le cloud computing car le prix peut apparaître élevé par rapport à une solution de hosting classique si les services supplémentaires proposés par Windows Azure ne s’appliquent pas dans votre cas : élasticité simplifiée, pré-production facilitée et géo-localisation. A vous de sortir vos calculettes pour définir à partir de quel moment il est plus rentable d’héberger vous-mêmes votre solution ou de la pousser dans les nuages d’Azure.
Par contre, si vous avez besoin de manière ponctuelle d’un nombre important de ressources, Windows Azure apparaîtra comme une solution de 1er choix.
Plus d’infos sur Windows Azure :
- le centre de développement MSDN : https://msdn.microsoft.com/fr-fr/azure/
- Ze Cloud : https://www.zecloud.fr/
Quels sont les impacts d’Azure sur le développement ?
Revenons à Cloudy Pizza et tentons d’analyser les impacts qu’Azure a eu sur le développement.
Finalement, très peu ! Pour quelles raisons ? Tout simplement car le .NET Framework 3.5 SP1 est nativement hébergé dans Windows Azure et que je peux donc souvent déployer telle quelle une application ASP.NET. Par ailleurs, SQL Azure est une version de SQL 2008 hébergée par Microsoft. Il y a cependant quelques petites subtilités à connaître en fonction des scénarios. Si le sujet vous intéresse, mon collègue Pierre Couzy a fait une série de posts sur le sujet sur son blog : https://blog.couzy.com/ D’ailleurs, il indique également comment héberger votre application PHP dans Windows Azure. J’en avais déjà parlé pour ma part dans un post précédent. De plus, je ne serais aussi que trop vous conseiller de parcourir l’ensembles des posts et vidéos de Patrick Guimonet ici : https://blogs.technet.com/patricg/archive/2009/10/09/premiers-pas-avec-sql-azure-les-vid-os-sont-en-ligne.aspx qui vous guidera de la création de la base à la migration des données d’une instance locale vers SQL Azure.
Dans mon cas, je n’ai eu qu’à recréer une base de données à travers le portail d’administration de SQL Azure, de créer un schéma similaire à celui de ma base de données SQL Express 2008 et d’injecter les mêmes données. Une fois l’opération faîte, restait plus qu’à changer la chaîne de connexion. Dans mon cas, rien d’autre à faire !
Voici la tête du portail d’administration :
Et voici à quoi ressemblent les chaînes de connexion :
Alors c’est tout, il faut juste changer la chaîne de connexion dans tous les cas ?
Non, cela serait malhonnête de ma part de tenter de vous faire croire cela. Si votre application ASP.NET ne fait jamais appel au système de fichiers local à la machine qui l’héberge, vous pourrez alors porter votre application logiquement telle quelle. Cependant, que se passe-t-il lorsque vous avez besoin de discuter avec le système de fichiers ?
Dans le cas d’une application hébergée dans Windows Azure, il faut pouvoir gérer le cas où notre code va être distribué sur plusieurs serveurs. Si notre application tourne sur 100 serveurs, hors de question de discuter directement avec une instance particulière. En effet, si l’utilisateur arrive d’abord sur l’instance 2, que l’on stocke des données sur cette instance et que le moment d’après l’utilisateur arrive sur l’instance 58, comment allez-vous synchroniser l’état entre les instances ?
Pour éviter cela, nous allons utiliser un système de fichiers distribués basé sur une architecture à base de Blob pour le stockage binaire des fichiers et Table pour stocker des informations diverses et variées. La notion de Table ne doit pas être comparée aux tables d’une base de données relationnelles. C’est une structure en tableau à plat que l’on peut par contre requêter via un provider LINQ. Toutes ces notions vous seront détaillées dans le coach MSDN. J’en avais également déjà fait mention dans un post précédent lorsque je présentais l’architecture de l’application que nous avions montrée en plénière des TechDays 2009.
L’avantage du stockage de Windows Azure est que l’on y accède via HTTP REST depuis n’importe laquelle de nos instances. Comme on peut le voir sur le schéma précédent, nos 10 instances discutent avec le même stockage centralisé/distribué. Voici par exemple les URLs correspondantes pour Cloudy Pizza sur le portail d’administration:
Mais vu que les données de mes fiches produits de Pizza, les commandes et les informations sur les utilisateurs sont stockées dans SQL Azure, à quoi m’a servi ce fameux “Azure Storage” ?
Comme je suis parti du template de projet Silverlight 3 “Business Application”, j’ai la possibilité de pouvoir créer des utilisateurs et de me loguer sur l’application. En effet, le template propose cela nativement comme j’ai déjà pu en parler dans ce post précédent sur l’introduction à .NET RIA Services. Cela mets alors en place une authentification ASP.NET par formulaire relayée ensuite vers le client Silverlight grâce à .NET RIA Services. Or, cette authentification ASP.NET est basée sur les Membership Provider connectés par défaut vers l’instance locale de SQL Express sur une base nommée aspnetdb.
Dans Windows Azure, nous n’avons pas d’instance locale de SQL Server pour gérer nos utilisateurs. Par contre, le système de Membership Provider d’ASP.NET est extensible et rien ne nous empêche de le brancher sur quelque chose d’autre. Dans mon cas, je l’ai donc simplement branché sur le stockage d’Azure en utilisant un sample du Windows Azure SDK nommé ASPProvider. Ensuite, il ne reste plus qu’à modifier le web.config pour qu’il utilise ces nouveaux providers:
<authentication mode="Forms" />
<anonymousIdentification enabled="true" />
<membership defaultProvider="TableStorageMembershipProvider"
userIsOnlineTimeWindow="20">
<providers>
<clear />
<add name="TableStorageMembershipProvider"
type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageMembershipProvider"
description="Membership provider using table storage"
applicationName="CloudyPizza.Web"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
minRequiredPasswordLength="1"
minRequiredNonalphanumericCharacters="0"
requiresUniqueEmail="true"
passwordFormat="Hashed" />
</providers>
</membership>
<roleManager enabled="true"
defaultProvider="TableStorageRoleProvider"
cacheRolesInCookie="true"
cookieName=".ASPXROLES"
cookieTimeout="30"
cookiePath="/"
cookieRequireSSL="false"
cookieSlidingExpiration="true"
cookieProtection="All">
<providers>
<clear />
<add name="TableStorageRoleProvider"
type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageRoleProvider"
description="Role provider using table storage"
applicationName="CloudyPizza.Web" />
</providers>
</roleManager>
L’ensemble est alors transparent pour le client Silverlight 3 qui discute avec une couche d’abstraction gérée par .NET RIA Services. Vous pouvez donc très bien imaginer écrire vos propres providers connectés à n’importe laquelle de vos sources de données.
En complément, je vous invite à lire ces 2 excellents articles traitant de la migration d’une application hébergée de manière “classique” vers Azure écrits par Sébastien Pertus :
- Plateforme Azure : Migrer ! : https://www.techheadbrothers.com/Articles.aspx/plateforme-azure-migrer
- Plateforme Azure : Migrez ! Part II : https://www.techheadbrothers.com/Articles.aspx/plateforme-azure-migrez-part-ii
Pour reprendre un schéma de Sébastien, à ce stade, le diagramme de Cloudy Pizza ressemble à cela :
Des pages dynamiques en fonction du rôle et du niveau d’authentification
Analysons un peu ce qu’il se passe lorsque l’on se connecte au site via le bouton “login”. Vous êtes prompté pour vous loguer :
Loguez-vous avec un compte déjà créé ou créez vous un compte en cliquant sur “Register Now”. Une fois authentifié, vous noterez l’apparition de nouveaux onglets/options dans la barre de menu de l’application Silverlight de manière dynamique :
Une fois authentifié, vous pouvez donc passer une commande un cliquant sur “basket” : un email de confirmation vous sera envoyé vers l’adresse email que vous aurez entré pendant le “Register Now”. Si vous cliquez sur “orders”, vous verrez la liste des commandes déjà effectuées. Pour commander, cliquez sur les images de pizza. Cela ajoutera une ligne de commande. Choisissez alors la quantité et le type :
Pour mettre en place les pages dynamiques, j’ai réutilisé la logique exposée par Brad dans ce post là. Dans son cas, il utilisait MEF et une réflexion coté serveur de packages XAP pour dynamiquement ajouter de nouvelles pages. Dans mon cas, j’ai coupé la partie MEF pour simplifier et mis en place une logique purement cliente. J’y reviendrais dans mon prochain post. Ensuite, les pages sont affichées en fonction de l’état de l’authentification ou du niveau de rôle (Administrateur, etc.). Tout cela en tagguant simplement les pages des bons attributs.
L’utilisation d’Exchange Online via ses WebServices
Quand Damien est arrivé avec ses aspirations d’IT Pro et convaincu qu’un développeur est une espèce de magicien capable de coder n’importe quoi grâce à du VBScript, j’ai eu un peu peur. :) Heureusement, autant IT Pro qu’il soit, il est moins bête qu’il en a l’air. Pour preuve, je l’ai déjà vu jouer avec Visual Studio (Respect !). Enfin, bon, on s’écarte du sujet.
Dans une vie passée, je savais très bien coder des applications discutant avec Exchange 2007 via les WebServices qu’il expose. Mais quiz de cet Exchange Online ? Vais-je devoir tout réapprendre et coder de manière différente ? Fort heureusement non ! C’est l’avantage de la symétrie que Microsoft propose entre le monde de l’entreprise et notre offre de cloud computing. Un développeur sachant manipuler les WebServices d’Exchange 2007 ne sera pas perdu avec ceux exposés par Exchange Online pour la simple et bonne raison que… ce sont les mêmes ! Exchange Online est donc bien un Exchange hébergé et maintenu par Microsoft avec lequel je peux travailler en tant que développeur de manière transparente.
On retrouve donc cette symétrie des produits et des compétences dans les 2 mondes tel qu’illustré par le diagramme suivant :
Dans Cloudy Pizza, j’ai donc tout simplement fait mon ajout de référence Web depuis l’URL qui va bien depuis les nuages : https://red002.mail.emea.microsoftonline.com/EWS/Exchange.asmx et la génération du proxy client s’est faite de manière habituelle. Ensuite, j’ai pu réutiliser tels quels les exemples fournis dans MSDN comme ceux-là par exemple:
- Creating E-mail Messages (Exchange Web Services) : https://msdn.microsoft.com/en-us/library/aa563009.aspx
- Getting User Availability (Exchange Web Services) : https://msdn.microsoft.com/en-us/library/aa494212.aspx
- Creating Appointments (Exchange Web Services) : https://msdn.microsoft.com/en-us/library/aa563060.aspx
Ni plus, ni moins.
M-V-VM ?
Le pattern MVVM (pour Model View View-Model) apporte une approche “à la MVC” particulièrement intéressante pour le monde de WPF ou Silverlight lorsqu’il s’agit d’industrialisation des développements. Mais, comme MVC, il ne sera pas à utiliser de manière systématique. Avec Mitsu, nous l’avons largement couvert lors de la journée des “Mercredis du développement” à l’aide de nos acolytes Simon d’Access-IT et Nicolas de Tekigo. Cette journée sera bientôt disponible en webcasts : https://blogs.msdn.com/mitsufu/archive/2009/09/04/mdd-industrialisation-des-d-veloppements-n-tiers-avec-wpf-et-silverlight.aspx.
Un développement MVVM vous apportera de nombreux bénéfices comme des tests unitaires performants et adaptés, des vues XAML uniquement dédiées à l’affichage et faisant appel de manière très agréable au binding, etc.
En Français, je vous conseille la lecture de ce post de Simon : https://www.simonferquel.net/blog/archive/2009/03/25/silverlight-silverlight-3--ria-services--mvvm-et-testabiliteacute.aspx , notre star du testing Silverlight et de MVVM. ;-)
En Anglais, notre architecte Nikhil a fait une série de posts très intéressante sur ce sujet :
- https://www.nikhilk.net/NET-RIA-Services-ViewModel-Pattern.aspx
- https://www.nikhilk.net/NET-RIA-Services-ViewModel-Pattern-2.aspx
- https://www.nikhilk.net/Silverlight-ViewModel-Pattern.aspx
- https://www.nikhilk.net/Silverlight-ViewModel-MVC.aspx
Pour l’instant, Microsoft ne propose pas vraiment de template de projet pour faire du MVVM sous Silverlight comme on peut le trouver pour WPF à travers le toolkit ou comme avec ASP.NET MVC. Cependant, il commence à éclore quelques initiatives intéressantes comme celle-ci que je vous conseille : https://www.galasoft.ch/mvvm/getstarted/
Code source à télécharger
Voilà pour ce tour d’horizon de Cloudy Pizza finalement assez long. J’ai finalement décidé de publier le code en “l’état” (== crade) car je n’aurais pas le temps de le rendre propre. Le code fut conçu avec Silverlight 3, .NET RIA Services de Juillet 2009 et le SDK d’Azure de Juillet 2009 également le tout sous Visual Studio 2008 SP1. Il faudra donc une configuration identique pour charger les 2 projets ci-dessous tels quels. Si j’ai le courage, je ferais un portage sous VS 2010/Silverlight 4/WCF RIA Services et la dernière version du SDK d’Azure.
Le code purement "On Premise" (aucune indépendance envers Azure) :
Le code porté pour Windows Azure/SQL Azure et appelant les WebServices de BPOS/Exchange Online :
Soyez indulgent avec le code ! :)
David