Bonsoir à tous !
Pour illustrer quelques possibilités offertes par WCF et Linq To SQL dans un projet .NET 3.5, j'ai choisis la thématique SNCF.
En ces temps de grève, on peut imaginer (avec un peu d'effort), que le nom des trains change fréquemment. Cette solution contiendra donc une interface WPF, avec laquelle nous pourrons modifier les noms des trains et ... c'est déjà pas mal.
Encore une fois le but du jeu est de tester et de réfléchir sur l'architecture que l'on peut mettre en place.
I Architecture de la solution :
- Un projet SNCF.DataAccessLayer avec LinqToSQL.
- Un projet SNCF.BusinessLayer avec les méthodes métiers.
- Un projet SNCF.Common pour les objets communs aux projets.
- un projet SNCF.WCFInterfaces qui définit les contrats.
- Un projet SNCF.WCFServices qui implémente les méthodes grâce à une classe.
- Un projet SNCF.WCFHost qui démarre le service WCF.
- et pour finir, le projet SNCF.UI.WPF qui consommera le service.
II Aperçu de l'interface WPF :
III DataAccess et LinqToSQL
Pour le projet d'accès aux données, il me suffit d'ajouter un fichier dbml, d'y ajouter ma table et les différentes procédures stockées, et le tour est joué.
C'est très physique le "glisser déplacer". 
III Business Layer
La couche métier définit trois méthodes statiques.
1 2 3 4 5 |
public static SNCF.Common.Train Get(Guid idTrain);
public static List<SNCF.Common.Train> GetAll();
public static bool Update(SNCF.Common.Train t);
|
IV WCFInterfaces
Le projet WCFInterfaces va permettre de définir les contrats, on y trouve une interface IServices.
On va déclarer les services que l'on veut utiliser et on y ajoute l'assembly ServiceModel qui va nous permettre de définir les contrats.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.ServiceModel; using SNCF.Common;
namespace SNCF.WCFInterfaces { [ServiceContract(Namespace = "http://localhost/WCF/TrainServices")] public interface IServices { [OperationContract] Train Get(Guid idTrain);
[OperationContract] List<Train> GetAll();
[OperationContract] bool Update(Train t); } }
|
VI WCFServices
Après avoir défini les contrats, on va créer une classe qui va implémenter l'interface, j'ai choisi "TrainServices.cs".
Cette classe associe, les méthodes déclarées dans le contrat à la couche BusinessLayer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using SNCF.WCFInterfaces; using SNCF.BusinessLayer; using SNCF.Common;
namespace SNCF.WCFServices { public class TrainServices : IServices { public Train Get(Guid idTrain) { return TrainDAO.Get(idTrain); }
public List<Train> GetAll() { return TrainDAO.GetAll(); }
public bool Update(Train t) { return TrainDAO.Update(t); } } }
|
VII WCFHost
Une fois l'ensemble (DataAccessLayer, BusinessLayer, WCFServices et WCFInterfaces) terminé, nous pouvons démarrer le service WCF.
C'est l'objectif de cette application console.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System.ServiceModel; using SNCF.WCFServices; using SNCF.WCFInterfaces;
namespace SNCF.WCFHost { class Program { static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(TrainServices));
host.AddServiceEndpoint(typeof(IServices), new BasicHttpBinding(), "http://localhost/WCF/TrainServices");
host.Open();
Console.WriteLine("Service Disponible"); Console.ReadLine();
host.Close(); } } }
|
VIII WPF UserInterface
L'interface WPF peut à présent se connecter au service.
1 2 3 |
ChannelFactory<IServices> myFactory; IServices myService; public MainWindow(){ InitializeComponent(); myFactory = new ChannelFactory<IServices>(new BasicHttpBinding(), http://localhost/WCF/TrainServices); myService = myFactory.CreateChannel(); // ComboBox DataSource cboTrain.ItemsSource = myService.GetAll(); } |
Conclusion :
Cette solution est très intéressante pour exposer très facilement toute la structure métier de son application sans se préoccuper de la nature, et de la localisation de l'interface utlisateur qui l'interroge. Si vous avez des remarques sur l'architecture, n'hésitez pas à intervenir, je suis friand de vos idées. 
L'intégralité de la solution est disponible à cette adresse. (La solution est réalisée avec Visual Studio 2008 béta 2).
PS : Cet article peut être amené à évoluer suivant vos remarques.