Warning : This page has been marked as an archive because the author consider that its content is no longer relevant.

Introduction

Lors du développement d’une application il peut arriver que plusieurs types de clients (WPF, ASP.NET ou Silverlight par exemple) utilisent les mêmes entités. La particularité de Silverlight par rapport à WPF ou ASP.NET est que la compilation du code .NET y est différente.

De même, lorsque nous accédons à des données par WCF, les classes utilisées par les services sont copiées côté Silverlight. Un des impacts de ce fonctionnement est que lorsqu’une modification est effectuée sur la classe source (donc celle côté service WCF), il faut regénérer la référence de service Silverlight et si l’on oublie on a donc un déphase entre le côté serveur et le côté client et là, attention aux dégâts.

Je vais ici vous présenter la méthode que j’utilise pour éviter ce genre de soucis.

Le contexte

Notre projet d’exemple pour cet article s’appelle EntityReuse.

Le projet est initialement réparti en deux parties :

  • EntityReuse (Client Silverlight)
  • EntityReuse.Web (Site web hébergeant les services WCF et le Silverlight)

Une bonne architecture

Un des secrets d’un projet bien réussi est une bonne architecture. J’ai pour habitude de mettre mes classes métiers dans un projet séparé.

Nous allons donc créer un projet nommé EntityReuse.Entities de type bibliothèque de classe normale (non Silverlight) qui contiendra la seule classe métier de notre exemple (mais bien entendu en réalité nous en avons beaucoup plus) dont voici la définition :

namespace EntityReuse.Entities
{
    [DataContract]
    public class User
    {
        [DataMember]
        public int ID { get; set; }

        [DataMember]
        public string FirstName { get; set; }

        [DataMember]
        public string LastName { get; set; }
    }
}

Cette classe très simple est prête à être utilisée par des services WCF (attributs DataContract et DataMember)

Le service web

Nous allons ensuite créer un service web WCF dans notre projet EntityReuse.Web dont voici l’interface et l’implémentation (n’oubliez par d’ajouter une référence au projet EntityReuse.Entities dans le projet Web) :

[ServiceContract]
public interface IUserService
{
    [OperationContract]
    User GetUser();
}

public class UserService : IUserService
{
    public User GetUser()
    {
        return new User { ID = 42, FirstName = "John", LastName = "Thiriet" };
    }
}

Nous pourrions dès maintenant ajouter une référence à notre service dans le projet Silverlight mais celà copierai les entités côté client aussi nous allons continuer à préparer le terrain avant celà.

Projet EntityReuse.Entities.Silverlight

Nous allons créer un nouveau projet de type bibliothèque de classe Silverlight que nous appellerons EntityReuse.Entities.Silverlight.

Ce projet sera en fait un mirroir du projet EntityReuse.Entities et permettra d’avoir une version Silverlight de notre bibliothèqe de classe.

Et ensuite nous allons ajout un lien symbolique vers le fichier User.cs du projet EntityReuse.Entities. Pour celà faîtes “Ajouter un élément existant” et naviguer vers le fichier voulu, ensuite cliquez sur la petite flèche à droite du bouton ajouter pour faire apparaître un menu déroulant et sélectionnez “Ajouter en tant que lien”.

EntityReuse_AddAsLink

Une fois le fichier ajouté vous remarquerez que son icône n’est pas le même que celui d’un fichier classique indiquant donc que c’est un lien symbolique.

EntityReuse_AddedAsLink

Maintenant il suffit d’effectuer les modification dans le projet Entities pour qu’elles soient répercutées dans notre bibliothèque de classes Silverlight. Problème de déphasage résolu.

Ajout de la référence au service

Maintenant que nous avons prépareéle terrain nous allons tout d’abord ajouter une référence au projet EntityReuse.Entities.Silverlight depuis notre projet Silverlight.

Ensuite nous procédons de la manière habituelle pour ajouter notre référence de service WCF. Vérifiez que la partie entourée en rouge dans la capture ci-dessous est bien séléctionnée et appuyez sur OK. C’est cette partie qui indique à Visual Studio de ne pas créer de copies des entités côté serveur.

Untitled

Une fois cette action terminée votre explorateur de solution devrait ressembler à ceci :

Untitled2

Vous noterez l’apparition d’un dossier DataSource avec dedans un fichier d’extensions .datasource indiquant l’assembly où se trouve votre entité (ici User).

Conclusion

Et voilà, nous avons donc une partie serveur et une partie cliente complétement synchrones au niveau des entités. Celà permet d’éviter bien des erreurs sur un gros projet !

N’oubliez par d’ajouter les bonnes références dans les différents projets (exemple référence à System.ServiceModel dans le projet EntityReuse.Entities.Silverlight).

Je vous inviter à télécharger le code source de cette application et ça se trouve comme d’habitude sur mon skydrive.

Comments