Exemple d'application métier avec Silverlight 3 et .NET RIA Services - Partie 5 : Astoria, Ajouter une référence de service et WinForms

Cet article fait partie d'une série de traductions d'articles de Brad Abrams sur le développement d'applications métier avec Silverlight 3 et .NET RIA Services.

Retrouvez l'ensemble des articles de la série sur cette page : Exemple d'application métier avec Silverlight 3 et .NET RIA Services.

Commentez cet article : Commentez Donner une note à l'article (5)

Article lu   fois.

Les deux auteurs

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

Traduction

Astoria, ajouter une référence de service et WinForms

Encore plus de mises à jour sur ma présentation du Mix09 intitulée « building business applications with Silverlight 3 ». Cette fois ce sera du contenu nouveau - ce qui n'aurait pas pu être fait avant cette version.

Cette démo prendra la logique d'application que nous avons créée dans ma présentation Mix09 et placera dessus un point d'entrée de service web basé sur REST avec ADO.NET Data Services.

Image non disponible

Ceci pourrait être utile si une application commence en tant que simple application Internet riche (RIA) mais que plus tard vous découvrez que vous voudriez ajouter une couche de services plus explicite afin de permettre à un large éventail de clients d'accéder à votre application. Heureusement tout votre investissement dans la logique de l'application serveur continue à porter ses fruits.

Juste pour démontrer ce point, nous consommerons par la suite le service à partir d'une application WinForms. Cela étend encore plus votre portée et votre marge d'utilisation des RIA Services !

La démo requiert les éléments suivants (tout est 100 % gratuit) :

Vous pouvez, de plus, télécharger les fichiers de la démo complète et jeter un œil à l'application en cours d'exécution.

Démarrez avec l'application là où nous avions laissé les choses dans la quatrième partie. Dans le projet de serveur, ajoutons un point d'entrée REST au DomainService. Cela permettra à n'importe quel client arbitraire d'accéder au DomainService et nous donne une chance de contrôler sélectivement ce qui sera exposé.

Image non disponible

Ensuite nous personnalisons la classe qui a été créée pour nous.

 
Sélectionnez
public class SuperEmployeeService : DataService<SuperEmployeeDomainService>, IServiceProvider
{
   // This method is called only once to initialize service-wide policies.
   public static void InitializeService(IDataServiceConfiguration config)
   {
       config.SetEntitySetAccessRule("*", EntitySetRights.All);
       config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
   }

Remarquez qu'ici j'utilise le mode « démo » avec « * » et « All »... C'est ici que vous pouvez contrôler quels aspects du Domain sont destinés à être accessibles via n'importe quel client et qui font vraiment partie de l'application Silverlight. C'est une bonne pratique de les lister explicitement.

Maintenant je vais tout simplement faire un clic droit et visualiser dans le navigateur... Nous obtenons le point d'entrée RESTd'ADO.NET Data Services(Astoria). Mais plutôt que d'attaquer directement ma base de données, j'ai maintenant un moyen formel pour ajouter la logique d'application.

Image non disponible

Nous pouvons même parcourir les données via les formats standards d'URL Astoria.

Encore une fois, remarquez ici que tous les appels sont exécutés à travers votre DomainService afin que la logique d'application contrôle l'accès, la forme et le contenu de toutes les données.

http://localhost:52878/SuperEmployeeService.svc/$metadata.

Image non disponible

http://localhost:52878/SuperEmployeeService.svc/SuperEmployee(12).

Image non disponible

Ok, ça c'est cool... mais faisons quelque chose de plus utile. Que diriez-vous de créer un client WinForms à partir de ce service ? Remarquez que cela fonctionnerait avec WPF, Ajax ou même n'importe quel client Java ! 

Ajoutez une nouvelle application WinForms, ensuite ajoutez une référence de service.

Image non disponible

Oh, et Shawn Wildermuth, ce « Ajouter une référence de service » est pour toi ! Nous en avons parlé durant le Mix et le voici maintenant dans les détails ! Amuse-toi !

Maintenant nous ajoutons un petit formulaire...

Image non disponible

Et un peu de code-behind assez simple... Nous mettons en place le proxy à Astoria.

 
Sélectionnez
SuperEmployeeDomainService context; 
public Form1()
{
   InitializeComponent();
&#160;
   context = new SuperEmployeeDomainService(
       new Uri("http://localhost:52878/SuperEmployeeService.svc/"));
   context.MergeOption = MergeOption.AppendOnly;
}

Maintenant nous pouvons tout simplement charger les données.

 
Sélectionnez
private void loadButton_Click(object sender, EventArgs e){
&#160;
   var savedCursor = Cursor.Current;
   Cursor.Current = Cursors.WaitCursor;
   var q = from emp in context.SuperEmployee
           where emp.Issues > 10
           orderby emp.Name
           select emp;
&#160;
&#160;
   dataGridView1.DataSource = q.ToList();
   dataGridView1.CellEndEdit += dataGridView1_CellEndEdit;
   Cursor.Current = savedCursor;
&#160;
}

Appuyez sur F5 ensuite sur Load et vous obtenez vos données ! Encore une fois, à travers ce même ensemble de logique d'application.

Image non disponible

Ajoutons maintenant un peu de code afin de mettre à jour le serveur quand les données sur le client changent.

 
Sélectionnez
&#160;
void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
   var row = dataGridView1.Rows[e.RowIndex].Cells;
   int empId = Convert.ToInt32(row["EmployeeId"].Value);
&#160;
   var q = from emp in context.SuperEmployee
           where emp.EmployeeID ==empId 
           select emp;
   var employee = q.FirstOrDefault();
&#160;
   employee.Gender = row["Gender"].Value as string;
   employee.Issues = Convert.ToInt32(row["Issues"].Value);
   employee.LastEdit = DateTime.Now;
   employee.Name = row["Name"].Value as string;
   employee.Origin = row["Origin"].Value as string;
   employee.Publishers = row["Publishers"].Value as string;
   employee.Sites = row["Sites"].Value as string;
&#160;
   var savedCursor = Cursor.Current;
   Cursor.Current = Cursors.WaitCursor;
   context.UpdateObject(employee);
   context.SaveChanges();
   Cursor.Current = savedCursor;
}

Ici nous gérons simplement l'évènement quand la cellule a fini d'être éditée... Ensuite nous cherchons l'objet employé qui correspond à cette ligne et nous mettons à jour ces valeurs.

Là encore, ce même schéma pourrait fonctionner pour tout client qui fonctionne avec Astoria aujourd'hui...

NdT : Il y a une façon de faire plus simple

 
Sélectionnez
void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
   var employee = (Employee)dataGridView1.Rows[e.RowIndex].DataboundItem;
&#160;
   var savedCursor = Cursor.Current;
   Cursor.Current = Cursors.WaitCursor;
&#160;
   context.UpdateObject(employee);
   context.SaveChanges();
&#160;
   Cursor.Current = savedCursor;
}

Conclusion

Ceci conclut donc la cinquième partie de cette série. Dans la sixième partie nous aborderons les objets de transfert de données (en anglais, Data Transfer Objects - DTOs).

Remerciements

Je tiens ici à remercier Brad Abrams pour nous avoir autorisé à traduire son article.
Je remercie également ClaudeLELOUP pour sa relecture et ses propositions.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2011 Brad Abrams. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.