S4 Cours1 C# Partie4

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 160

Le Langage c#

Technologies DotNet

Hiba Chougrad
Année-universitaire: 2021-2022

23/11/2021 1
23/11/2021 2

Plan
 L’environment .NET
 Initiation à la programmation C#
 Programmation Orientée Objet C#
 Les contrôles avancés
23/11/2021 3

ADO.NET
23/11/2021 4

Créer une base de données

On peut utiliser Visual Studio pour créer et mettre à jour un fichier de base de
données local dans SQL Server Express LocalDB.

On peut également créer une base de données en exécutant des instructions
Transact-SQL dans la fenêtre de l'outil SQL Server Object Explorer de Visual
Studio.

Ou bien l’importer des fournisseurs de données ACCESS, OleDb, Odbc,


OracleClient,..
23/11/2021 5

Créer une base de données


1. Créer un projet et un fichier de base de données local
• Créez un projet Windows Forms App et nommez-le CreationBdTest1.
• Dans la barre menu, séléctionnez Project > Add New Item.
• Dans la liste d’Items, séléctionnez Service-based Database.
• Nommez la base de données Ecole par exemple, puis cliquez sur Add.
• Si la fenêtre Data Sources n'est pas ouverte, ouvrez-la en sélectionnant View > Other
Windows > Data Sources.
• Dans la fenêtre Data Sources, sélectionnez Add New Data Source : Data Source Configuration
Wizard va s’ouvrir
• Dans la Choose a Data Source Type, choisissez Database, puis choisissez Next.
• Sur la page Choose a Database Model, choisissez Next pour accepter les paramètres par défaut.
• Sur la page Choose Your Data Connection, sélectionnez le fichier Ecole.mdf, puis cliquez sur Next
jusqu’à avoir le bouton Finish.
• Vous pouvez voir la chaîne de connexion pour Ecole.mdf dans SQL Server Object Explorer ou bien
dans Server Explorer.
23/11/2021 6

Créer une base de données


1. Créer un projet et un fichier de base de données
local
 Création de tables et des clés à l'aide de Table Designer
• Dans Server Explorer, listez le nœud Data Connections, puis
listez le nœud Ecole.mdf
• Cliquez avec le bouton droit sur Tables et sélectionnez Add New
Table.
• Le table Designer s’ouvre et affiche une grille avec une ligne par
défaut, qui représente une seule colonne dans la table que vous
avez crée. En ajoutant des lignes à la grille, vous allez ajouter
des colonnes dans la table. Vous pourrez spécifier les clés
primaires et autres caractéristiques des champs.
• Cliquez sur Update pour enregistrer les modifications.
• Sélectionnez la table Personne, cliquez-droit sur Show Table
Data pour ajouter des données.
23/11/2021 7

Créer une base de données


La base de données Northwind Traders est un exemple de base de données fourni avec la
suite Microsoft. La base de données Northwind contient les données de vente d'une entreprise
fictive appelée Northwind Traders, qui importe et exporte des aliments de spécialité du monde
entier.

2. Créer une base de données en exécutant des instructions Transact-SQL


• Téléchargez le script https://github.com/microsoft/sql-server-
samples/blob/master/samples/databases/northwind-pubs/instnwnd.sql
• Créez un projet Windows Forms App et nommez-le CreationBdTest2.
23/11/2021 8

Créer une base de données


2. Créer une base de données en exécutant des instructions Transact-SQL
• Dans Visual Studio, ouvrez la fenêtre Server Explorer .
• Cliquez avec le bouton droit sur Data Connections et choisissez Create New SQL Server
Database.
• Dans la zone Server name, entrez (localdb)\mssqllocaldb.
• Dans la zone New database name, entrez Northwind, puis choisissez OK : La base de
données Northwind vide est créée et ajoutée au Data Connections node dans Server Explorer.
• Cliquez avec le bouton droit sur la connexion de données Northwind et sélectionnez New
Query(Nouvelle requête): Une fenêtre d’éditeur de requête s'ouvre.
• Copiez le script Northwind Transact-SQL dans votre Presse-papiers.
• Collez le script T-SQL dans l'éditeur de requête, puis cliquez sur le bouton Execute.
• Après un court instant, la requête se termine et les objets de base de données sont créés.
23/11/2021 9

Créer une base de données


2. Créer une base de données en exécutant des instructions Transact-SQL
23/11/2021 10

Créer une base de données


La base de données Northwind Traders est un exemple de base de données fourni avec la
suite Microsoft. La base de données Northwind contient les données de vente d'une entreprise
fictive appelée Northwind Traders, qui importe et exporte des aliments de spécialité du monde
entier.

3. Importer un fichier de base de données


• Téléchargez la BD si vous ne la trouvez pas par défaut sur Ms Access
https://github.com/fsprojects/SQLProvider/blob/master/docs/files/msaccess/Northwind.MDB
Créez un projet Windows Forms App et nommez-le CreationBdTest3.
• Dans Visual Studio, ouvrez la fenêtre Server Explorer .
• Cliquez avec le bouton droit sur Data Connections et choisissez Add Connection…
23/11/2021 11

Créer une base de données


3. Importer un fichier de base de données
• Mettez votre choix de fournisseur (Data Provider) dans le champ Data Source: dans le cas
de Northwind par exemple on met Microsoft Access Database File (OLE DB).
• Cherchez la base de données localement et mettez la dans Database File Name.
• L’ajout d’un mot de passe n’est pas obligatoire.
• Cliquez Ok et la base de données sera importée.
23/11/2021 12

ADO.NET
ADO.NET : ActiveX Data Objects
• Une technologie de base de données de la plate-forme .NET (Dot Net) et repose sur
Microsoft ActiveX Data Objects.

• ADO est un modèle objet indépendant du langage, ce qui constitue la base de la


stratégie d'accès universel aux données de Microsoft.

• ADO.NET fait partie intégrante du .NET Compact Framework et fournit un accès aux
données relationnelles, aux documents XML et aux données d'applications.

• ADO fournit des services d’accès et de gestion de données situées sur une base de
données relationnelle (SQL Server, MySQL...) ou non SQL. Il est constitué de deux
composants : un premier pour la connexion et un second pour la gestion.
23/11/2021 13

ADO.NET
Deux modes de fonctionnement
• Mode connecté : le programme se connecte à la base de données et
effectue des opérations comme SELECT, INSERT, UPDATE... La connexion
est ensuite fermée et aucune donnée n’est donc stockée en mémoire sur le
client. (mode classique)

• Mode déconnecté : le programme se connecte à la base de données,


récupère les données et les stocke en mémoire et referme immédiatement la
connexion. Tout se passe après en mémoire locale. Ceci libère les ressources
du serveur de données. (nouveauté de l'architecture .net)
23/11/2021 14

ADO.NET
ADO.NET définit les objets DataSet et DataTable optimisés pour le déplacement d’ensembles
de données déconnectés. Il inclut également les objets Connection et Command traditionnels,
ainsi qu'un objet DataReader qui ressemble à un jeu d'enregistrements ADO en lecture seule.
Voici quelques classes de ADO.NET :
23/11/2021 15

Exemple: On va mettre la table personne dans un DataGridView :


23/11/2021 16

CRUD avec ADO.NET


Create, Read, Update, Delete (CRUD)
23/11/2021 17

CRUD avec ADO.NET


• Construire la chaine de connexion et établir la connexion
// construire la chaine de connexion
string ConnectionString = @"Data
Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\ALIENWARE\source\repos\Creat
ionBdTest\CreationBdTest\Ecole.mdf;Integrated Security=True";
// Créer et ouvrir la connexion
SqlConnection connection = new SqlConnection(ConnectionString);
connection.Open();

• Préparer la commande
string queryString = "select * from Personne";
SqlCommand command = new SqlCommand(queryString, connection);

• Pour le CRUD, Il y a deux façons de faire :


23/11/2021 18

CRUD avec ADO.NET


1/ Exécuter la commande et récupérer le résultat (lecture)
23/11/2021 19

CRUD avec ADO.NET


2/Une deuxième solution (plus verbeuse) avec SqlDataAdapter et DataSet
L’espace de noms System.Data est nécessaire pour cette deuxième solution
23/11/2021 20

CRUD avec ADO.NET


23/11/2021 21

CRUD avec ADO.NET


Insérer une personne dans la base de données avec une requête paramétrée :

String query = "insert into personne (num, nom, prenom) values(


@num, @nom, @prenom)";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@nom", "wick");
command.Parameters.AddWithValue("@prenom", "john");
command.Parameters.AddWithValue("@num", 100);
int i = command.ExecuteNonQuery(); // operations catalogues UPDATE,
// INSERT, ou DELETE sans utiliser Dataset
Console.WriteLine($"number of added persons is {i}");
23/11/2021 22

CRUD avec ADO.NET


Solution avec DataSet
SqlDataAdapter adapter = new SqlDataAdapter();
string selectQuery = "select * from personne";
SqlCommand command = new SqlCommand(selectQuery, connection);
adapter.SelectCommand = command;
DataSet Ds = new DataSet();
adapter.Fill(Ds, "Personne");
// créons un DataTable associé a la table Personne
DataTable dataTable = Ds.Tables["Personne"];
var newRow = dataTable.NewRow();
newRow["num"] = 11;
newRow["nom"] = "Blake";
newRow["prenom"] = “Jessy";
dataTable.Rows.Add(newRow);
// Et pour créer un objet requete
new SqlCommandBuilder(adapter);
// appeler la méthode Update pour faire les requêtes INSERT, UPDATE et DELETE
int i = adapter.Update(dataTable);
Console.WriteLine($"number of added people is {i}");
23/11/2021 23

CRUD avec ADO.NET


Modifier une personne dans la base de données avec une requête paramétrée

String query = "update personne set nom =@nom, prenom = @prenom where num = @num";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@nom","denzel");
command.Parameters.AddWithValue("@prenom","washington");
command.Parameters.AddWithValue("@num",15);
int i = command.ExecuteNonQuery();
Console.WriteLine($"number of updated people is {i}");
23/11/2021 24

CRUD avec ADO.NET


Supprimer une personne dans la base de données avec une requête paramétrée

String query = "delete from personne where num = @num";


SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@num",100);
int i = command.ExecuteNonQuery();
Console.WriteLine($"number of deleted people is {i}");
23/11/2021 25

ADO.NET (MySQL dans un projet C#)


Pour se connecter à une base de données (autre que SQL Server ) à partir de Visual
Studio, il faut :
• Un connecteur (MySQL Connector)
• Integrer MySQL dans Visual Studio

Télécharger les installers .msi


• https://dev.mysql.com/downloads/connector/net/
• https://dev.mysql.com/downloads/windows/visualstudio/1.2.html

Ensuite :
• Installer les deux
• (Re)lancer Visual Studio
• Créer un nouveau projet C# (console)
23/11/2021 26

Référencer MySQL dans un projet C#


Pour utiliser une base de données MySQL dans un projet C#, il faut
l’ajouter en tant que référence
23/11/2021 27

Classe Connexion et DAL


Organisation du code
• Il faut mettre toutes les données (url, nomUtilisateur, motDePasse...) relatives
à notre connexion dans une classe connexion

• Pour chaque table de la base de données, on crée un modèle, une classe C#,
ayant comme attributs les colonnes de cette table

• Il faut mettre tout le code correspondant à l’accès aux données (de la base de
données) dans des nouvelles classes et interfaces qui constitueront la couche
DAL : Data Access Layer (DAO en Java)
23/11/2021 28

Classe Connexion et DAL


La classe MyConnexion

using System.Data.SqlClient;
namespace MyProject {
class MyConnexion {
private static SqlConnection connection;
private MyConnexion() {
string connectionString = @"Data Source=(…"
SqlConnection connection = new SqlConnection(connectionString);
try {
connection.Open();
}
catch(SqlException e) {
connection = null;
Console.WriteLine(e.StackTrace);
}
}
23/11/2021 29

Classe Connexion et DAL


public static SqlConnection GetConnexion() {
if (connection == null) {new MyConnexion();}
return connection;
}
public static void CloseConnection(){
if (connection != null){
connection.Close();
connection = null;
}
}
}
}
23/11/2021 30

Classe Connexion et DAL


La classe Personne dans un répertoire model
namespace MyProject {
public class Personne {
public int Num { get; set; }
public String Nom { get; set; }
public String Prenom { get; set; }
public Personne(){}
public Personne(String nom, String prenom){
this.Nom = nom;
this.Prenom = prenom;}
public Personne(int num, String nom, String prenom){
Num = num;
Nom = nom;
Prenom = prenom;}
}
}
23/11/2021 31

Classe Connexion et DAL


L’interface IPersonne

namespace MyProject {
public interface IPersonne{
int Save(Personne personne);
int Update(Personne personne);
int Delete(int id);
List<Personne> FindAll();
Personne FindById(int id);
}
}
23/11/2021 32

Classe Connexion et DAL


La classe PersonneRepository
namespace MyProject{
public class PersonneRepository : IPersonne {
public List<Personne> FindAll(){
SqlDataReader result = null;
List<Personne> personnes = new List<Personne>();
SqlConnection connection = MyConnexion.GetConnexion();
if (connection != null) {
String query = "select * from personne";
SqlCommand command = new SqlCommand(query, connection);
result = command.ExecuteReader();
while (result.Read()){
personnes.Add(new Personne(Int32.Parse(result[0].ToString()),result[1].ToString(),
result[2].ToString()));
}
}
result.Close();
MyConnexion.CloseConnection();
return personnes;
}
23/11/2021 33

Classe Connexion et DAL


La classe PersonneRepository (suite)
public int Save(Personne personne) {
int i = 0;
SqlConnection connection = MyConnexion.GetConnexion();
if (connection != null) {
string query = "insert into personne values(@num, @nom,@prenom)";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@num", personne.Num);
command.Parameters.AddWithValue("@nom", personne.Nom);
command.Parameters.AddWithValue("@prenom", personne.Prenom);
i = command.ExecuteNonQuery();
MyConnexion.CloseConnection();
}
return i;
}
public int Update(Personne personne) { throw new
NotImplementedException();}
public Personne FindById(int id) { throw new NotImplementedException(); }
public int Delete(int id) { throw new NotImplementedException(); }
}
}
23/11/2021 34

Classe Connexion et DAL


Le Main pour tester toutes ces classes

class Program {
static void Main(string[] args) {
PersonneRepository personneRepository = new PersonneRepository();
List<Personne> personnes = personneRepository.FindAll();
personnes.ForEach(personne => Console.WriteLine(personne.Nom + " " +personne.Prenom));
Console.WriteLine("Fin");
}
}
23/11/2021 35

LINQ
23/11/2021 36

LINQ ?
• Language-INtegrated Query (ou Requête intégrée au langage en Français)
• est un composant du .NET Framework
• était un projet de recherche Microsoft avant qu’il soit intégré dans .NET
Framework
• est inspiré par le langage SQL
• ajoute de grandes capacités d’interrogation sur des données aux langages
.NET
• s’applique sur les listes, les objets, les fichiers XML, les entités, les bases de
données relationnelles...
23/11/2021 37

LINQ
23/11/2021 38

LINQ
23/11/2021 39

LINQ
23/11/2021 40

LINQ
23/11/2021 41

Exemple (LINQ)
• Exemple requête
// data source
int[] numbers = new int[8] {1, 2, 3, 4, 5, 6, 7, 8};
// query expression
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
// query execution in foreach
foreach (int num in numQuery)
Affiche :
{
2468
Console.Write("{0} ", num);
}
23/11/2021 42

Exemple (LINQ)
• Explication
23/11/2021 43

Exemple (LINQ)
• Attention !

int[] numbers = new int[8]{1, 2, 3, 4, 5, 6, 7, 8};


IEnumerable<int> numQuery =
from num in numbers
where (num % 2) == 0
select num;
foreach (int num in numQuery)
{
Console.Write("{0} ", num);
}
23/11/2021 44

Exemple (LINQ)
• Exemple avec expression Lambda

int[] numbers = new int[8]{1, 2, 3, 4, 5, 6, 7, 8};


// expression Lambda
IEnumerable<int> numQuery = numbers.Where(elt => elt % 2 == 0);
foreach (int num in numQuery)
{
Console.Write("{0} ", num);
}

Affiche :
2468
23/11/2021 45

Exemple (LINQ)
• Il est aussi possible de définir plusieurs conditions
int[] numbers = new int[8]{1, 2, 3, 4, 5, 6, 7, 8};
var numQuery = Affiche :
from num in numbers 268
where (num % 2) == 0 && (num > 5 || num < 3)
select num;
foreach (int num in numQuery) { Console.Write("{0} ", num); }

• Avec les expressions Lambdas

int[] numbers = new int[8]{1, 2, 3, 4, 5, 6, 7, 8};


IEnumerable<int> numQuery = numbers Affiche :
.Where(elt => elt % 2 == 0 && (elt > 5 || elt < 3)); 268
foreach (int num in numQuery) { Console.Write("{0} ", num); }
23/11/2021 46

LINQ to Objects
23/11/2021 47

LINQ to Objects
• Etant donnée la classe Personne suivante
class Personne
{
public Personne(int num, string nom, string prenom,int budget)
{
this.Nom = nom;
this.Prenom = prenom;
this.Num = num;
this.Budget = budget;
}
public int Num { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public int Budget { get; set; }
}
23/11/2021 48

LINQ to Objects
• Créons une liste a partir de cette classe Personne
List<Personne> personnes = new List<Personne>()
{
new Personne(1,"wick","john",500),
new Personne(2,"abruzzi","john",700),
new Personne(3,"dalton","jack",300),
new Personne(4,"white","mike",800),
};

• Pour afficher les personnes qui ont un budget supérieur a 500


IEnumerable <Personne> persoQuery =
from perso in personnes ça affiche :
where ( perso.Budget > 500 ) Je m’appelle john abruzzi
select perso; Je m’appelle mike white
foreach ( Personne perso in persoQuery ){
Console.WriteLine($"Je m’appelle { perso.Prenom } {perso.Nom }");
}
23/11/2021 49

LINQ to Objects
• Autre solution avec l’expression Lambda

var persoQuery = personnes.Where(elt => elt.Budget > 500);


foreach ( Personne perso in persoQuery )
{
Console.WriteLine($"Je m’appelle { perso.Prenom ça affiche :
Je m’appelle john abruzzi
} { perso.Nom }");
Je m’appelle mike white
}
23/11/2021 50

LINQ to Objects
• Si on veut sélectionner seulement quelques attributs (et les renommer)
var persoQuery =
from perso in personnes
where (perso.Budget > 500)
select new {
Name = perso.Nom, // on renomme l’attribut Nom en Name et Num en Number
Number = perso.Num
};
foreach ( var perso in persoQuery ){
Console.WriteLine($"Je m’appelle { perso.Name } {perso.Number }");
}
Mai

ça affiche :
Je m’appelle abruzzi 2
Je m’appelle white 4
23/11/2021 51

LINQ to Objects
• Autre solution avec l’expression Lambda
var persoQuery = personnes
.Where(elt => elt.Budget > 500)
.Select(elt => new {
Name = elt.Nom,
Number = elt.Num
}
);
foreach ( var perso in persoQuery ){
Console.WriteLine($"Je m’appelle { perso.Name }{perso.Number }");
}

ça affiche :
Je m’appelle abruzzi 2
Je m’appelle white 4
23/11/2021 52

LINQ to Objects
23/11/2021 53

LINQ to Objects
• Exemple avec orderby
IEnumerable<Personne> persoQuery =
from perso in personnes
where ( perso.Budget >= 500 )
orderby perso.Nom ascending // ou descending
select perso;
foreach ( Personne perso in persoQuery ){
Console.WriteLine($"Je m’appelle { perso.Prenom } { perso.Nom
}");
}
ça affiche :
Je m’appelle john abruzzi
Je m’appelle mike white
Je m’appelle john wick
23/11/2021 54

LINQ to Objects
• La solution avec l’expression Lambda

IEnumerable<Personne> persoQuery =
personnes.Where(perso => perso.Budget >= 500)
.OrderBy(perso => perso.Nom);
foreach ( Personne perso in persoQuery ){
Console.WriteLine($"Je m’appelle { perso.Prenom }{ perso.Nom }");
}

ça affiche :
Je m’appelle john abruzzi
Je m’appelle mike white
Je m’appelle john wick
23/11/2021 55

LINQ to Objects
• Exemple avec group ... by ... into
var persoQuery =
from perso in personnes
group perso by perso.Prenom into initial
select initial;
23/11/2021 56

LINQ to Objects
• Exemple avec group ... by ... into
foreach (IGrouping<string, Personne> elt in persoQuery){
Console.WriteLine(elt.Key);
foreach (var perso in elt){
Console.WriteLine(" {0}, {1}", perso.Prenom, perso.Nom);}
}

ça affiche :
john
john, wick
john, abruzzi
jack
jack, dalton
mike
mike, white
23/11/2021 57

LINQ to Objects
• Solution avec les expressions Lambda
var persoQuery =
personnes.GroupBy(perso => perso.Prenom);
foreach (IGrouping<string, Personne> elt in
persoQuery)
{
Console.WriteLine(elt.Key);
foreach (var perso in elt){
Console.WriteLine(" {0}, {1}", perso.Prenom, perso.Nom);}
}
23/11/2021 58

LINQ to Objects
• Considérons la deuxième liste suivante

List<Personne> sportifs = new List<Personne>(){


new Personne(1,"wick","john",500),
new Personne(4,"white","mike",800),
new Personne(5,"wolf","nicolas",700),
new Personne(6,"hamilton","bill",300),
};

Si on veut afficher la liste des personnes qui sont dans la


liste sportifs?
Solution avec les jointures
23/11/2021 59

LINQ to Objects
• Solution avec join ... on ... equals
// join permet de faire la jointure
var persoSportifQuery =
from perso in personnes
join sportif in sportifs
on perso.Num equals sportif.Num
select new {
Name = perso.Nom,
Sport = sportif.Prenom
};
// select new permet de construire un nouvel objet
foreach (var elt in persoSportifQuery){
Console.WriteLine("{0} {1}", elt.Name, elt.Sport);
}
23/11/2021 60

LINQ to Objects
• Solution avec l’expression Lambda
var persoSportifQuery = personnes.Join(
sportifs,
perso => perso.Num,
sportif => sportif.Num,
(perso, sportif) => new {
Name = perso.Nom,
Sport = sportif.Prenom
}
);
foreach (var elt in persoSportifQuery){
Console.WriteLine("{0} {1}", elt.Name, elt.Sport);
}
23/11/2021 61

LINQ to SQL
23/11/2021 62

LINQ to SQL
• Créer une base de données SQL Server
23/11/2021 63

LINQ to SQL
• Créer une table
23/11/2021 64

LINQ to SQL
• Ajouter des tuples dans la table
23/11/2021 65

LINQ to SQL
• Etape 2 : ajouter le fichier de classe de LINQ to SQL
23/11/2021 66

LINQ to SQL
• Etape 2 : vérifier l’ajout du fichier contexte
23/11/2021 67

LINQ to SQL
• Si Classes LINQ to SQL n’existe pas
23/11/2021 68

LINQ to SQL
• Etape 3 : intérroger la base de données
23/11/2021 69

LINQ to SQL
23/11/2021 70

LINQ to SQL
23/11/2021 71

LINQ to SQL
23/11/2021 72

LINQ to SQL
23/11/2021 73

LINQ to SQL
23/11/2021 74

Exemple
• Trouver une personne
Personne p = db.Personne.First(perso => perso.nom.Equals("wick"));
Console.WriteLine($"je m’appelle {p.prenom.Trim()} {p.nom.Trim()}");

• Trouver plusieurs personnes


var containsIQuery =
from perso in db.Personne
where perso.nom.Contains("i")
select perso;
foreach (var elt in containsIQuery){
Console.WriteLine(elt.nom);
}
23/11/2021 75

Exemple
• Modifier une personne
Personne p = db.Personne.First(perso => perso.nom.Equals("wick"));
p.nom = "abruzzi";
db.SubmitChanges();

• Supprimer une personne

Personne p = db.Personne.First(perso => perso.nom.Equals("wick"));


db.Personne.DeleteOnSubmit(p);
db.SubmitChanges();
23/11/2021 76

Exemple
• On peut aussi faire

var deletedPersonQuery =
from perso in db.Personne
where perso.nom.Equals("wick")
select perso;
if (deletedPersonQuery.Count() > 0){
db.Personne.DeleteOnSubmit(deletedPersonQuery.First());
db.SubmitChanges();
}
23/11/2021 77

LINQ
23/11/2021 78

Entity Framework
23/11/2021 79

Introduction

• Remarque: Il y a d’autres ORM pour C#


• NHibernate
• PetaPOCO
• Ces deux frameworks sont inspirés par certains concepts java comme le JavaBean
23/11/2021 80

Introduction
C’est quoi un ORM ?
23/11/2021 81

Introduction
Dans le cas d’Entity Framework
Les entités : des classes décorées (annotées)
Le gestionnaire d’entités : Linq to Entities

Trois approaches
• Code First : on crée les entités puis Visual Studio génère la base de données
• Database First : on crée la base de données (ou on a une base de données qui
existe déja) et Visual Studio génère nos entités a partir de cette base de données
• Model First : on crée notre modèle (de classe) et Visual Studio génère la base de
données et les entités correspondantes
23/11/2021 82

Code First
• Créez une nouvelle solution pour ce chapitre
• Créez un projet pour chaque exemple

Etapes à suivre:
• Création d’un projet Console
• Intégrer Entity Framework dans le projet
• Préparer le contexte Code First
• Créer les entités
• Générer la base de données et manipuler les données avec LINQ to Entities
23/11/2021 83

Code First
• Pour intégrer Entity Framework dans le projet, on utilise NuGet.
23/11/2021 84

Code First
Utiliser NuGet pour référencer Entity Framework
• Faire clic droit sur Références dans l’Explorateur de solution
• Choisir Gérer les packages NuGet
• Aller dans l’onglet Parcourir et chercher Entity Framework
• Choisir la dernière version stable et installer
• Accepter, attendre la fin de l’installation et aller vérifier dans la rubrique Références l’ajout des
packages relatifs à Entity Framework
Préparons le contexte Code First
• Clic droit sur le projet, Ajouter > Nouvel élément
• Dans Eléments Visual C#, cliquer sur Données et séléctionner ADO.NET Entity Data
Model
• Valider
• Choisir Modèle vide Code First et cliquer sur Terminer
23/11/2021 85

(Facultatif)
Référencer Entity Framework sans accès Internet

• Menu Tools → Options → Package Manager


• Donnez le nom et l'emplacement du dossier. Cliquez sur OK. Déposez vos
fichiers de package NuGet dans ce dossier.
• Sur votre projet, faites un clic droit et sélectionnez "Gérer les paquets
NuGet" et sélectionnez votre nouvelle source de paquet.
• Cliquer sur Installer.
23/11/2021 86

Code First
Contenu initial de Model1.cs
public class Model1 : DbContext Et si on veut donner plus de
{ détails?
public Model1(): base("name=Model1"){} Par exemple: sur la clé
} primaire, préciser la taille
//Dans ce fichier, on ajoute les entités qu’on va créer d’un champ, ….

Créons une première entité Personne


public class Personne Solution : utiliser les
{ décorateurs (annotations)
public int Id { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public int Age { get; set; }
}
23/11/2021 87

Code First
Décorateurs pour Personne
• [Table("personnes")] : indique que la table correspondante a cette entité sera nommée personnes
• [Column("ID")] : permet d’avoir un nom de colonne (ID) différent de celui de l’attribut
• [Key] : indique que cet attribut correspond à la clé primaire de la table
• [DatabaseGenerated(DatabaseGeneratedOption.Identity)] : précise que la clé primaire est Auto-Increment
(autres valeurs possibles : None et Computed)
• [MaxLength(20),MinLength(2)] : indique la longueur max et min de la chaine de caractère

Autres décorateurs
• [NotMapped] : indique que l’attribut sera utilisé seulement niveau applicatif et qu’il n’aura pas de correspondance
dans la base de données
• [Required] : précise que cette colonne ne prend pas la valeur null
• [ForeignKey("nomColonneTableOrigine")] : indique que cet attribut provient d’une autre table et fait référence
au nom de la clé étrangère
• [Display(Name = "Valeur à afficher")] : indique la valeur à afficher lorsqu’on fait référence à cet attribut
dans un formulaire par exemple
• [DataType(DataType.Type)] : précise un type spécifique d’un attribut : Password, Date...
• [Order] : doit être utilisé avec [Key] lorsque la clé primaire est composée
• …
23/11/2021 88

Code First
Attention :
• Entity Framework ne supporte pas certains types C# tels que: char...
• La liste des types compatibles :
https://www.devart.com/dotconnect/db2/docs/DataTypeMapping.html
23/11/2021 89

Code First
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[Table("personnes")]
public class Personne
{
[Column("ID")]
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Column("LastName")]
[MaxLength(20),MinLength(2)]
public string Nom { get; set; }
[Column("FirstName")]
public string Prenom { get; set; }
public int Age { get; set; }
}
23/11/2021 90

Code First
• Il faut alors mettre à jour Model1.cs

public class Model1 : DbContext


{
public Model1(): base("name=Model1"){}
public virtual DbSet<Personne> Personnes { get; set;}
}

• Dans le Main, on prépare les objets à persister


using(var model = new Model1())
{
var personne = new Personne()
{Nom = "Pradel", Prenom = "Jacques", Age = 45};

// on persiste la personne
model.Personnes.Add(personne);
model.SaveChanges();
}
23/11/2021 91

Code First
• Dans le Main, on prépare les objets à persister

using(var model = new Model1())


{
var personne = new Personne()
{Nom = "Pradel", Prenom = "Jacques", Age = 45};

// on persiste la personne
model.Personnes.Add(personne);
model.SaveChanges();

// on récupère le contenu de l’entité Personne


var personQuery = from person in model.Personnes
select person;
// on affiche la personne
foreach (var p in personQuery)
Console.WriteLine($"Bonjour { p.Prenom } { p.Nom }");
}
23/11/2021 92

Code First
• Soit une autre entité Adresse avec une clé primaire composée et une clé étrangère

public class Adresse


{
[Key]
[Column(Order=1)]
public int Rue { get; set; }
[Key]
[Column(Order=2)]
public string Ville{ get; set; }
[Key]
[Column(Order=3)]
public string CodeP{ get; set; }
[ForeignKey("Personne")]
public int PersonneId { get; set; }
public Personne Personne { get; set; }
}
23/11/2021 93

Code First
• Mettons à jour Model1.cs
public class Model1 : DbContext
{
public Model1(): base("name=Model1"){}
public virtual DbSet<Personne> Personnes { get; set;}
public virtual DbSet<Adresse> Adresses { get; set;}
}

• Dans le Main, on prépare les objets à persister

var adresse = new Adresse


{Rue = 32, Ville = "Paris", CodeP = "1301", Personne = personne};
// on persiste les données
model.Adresses.Add(adresse);
model.SaveChanges();
23/11/2021 94

Code First
 Deux tables ont été créées
• Personne avec les colonnes Id, Nom, Prenom et Age
• Adresse avec les colonnes Rue, Ville, CodeP et PersonneId (une clé étrangère
correspondant à l’identifiant d’une Personne)
 Aller dans le menu Affichage et cliquer sur Explorateur d’objets SQL Server
 Etendre la rubrique SQL Server
 Chercher la base de données et vérifier l’existence des deux tables:
23/11/2021 95

Code First
Les relations bidirectionnelles
• Pour une adresse donnée, on peut facilement connaitre la personne propriétaire
• Pour une personne donnée, il est plus difficile de trouver son adresse
• Ceci peut devenir plus simple si on rend les relations bidirectionnelles
public class Personne{
[Column("ID")] Propriétés de navigation :
[Key] Public Personne Personne {}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] de l’entité Adresse et
public int Id { get; set; } public Icollection <Adresse>
[Column("LastName")] Adresses de l’entite Personne
[MaxLength(20),MinLength(2)] permettent de récupérer
public string Nom { get; set; } respectivement la liste d’adresses
[Column("FirstName")] d’une personne et la
public string Prenom { get; set; } personne propriétaire d’une
public int Age { get; set; } adresse.
public ICollection<Adresse> Adresses { get; set; }
}
23/11/2021 96

Code First using (var model = new Model1())


{
Program.cs
var personne = new Personne()
Les relations bidirectionnelles {Nom = "Pradel", Prenom = "Jacques",Age = 45};
// on persiste la personne
model.Personnes.Add(personne);
var adresse = new Adresse
public class Personne{ Model1.cs {Rue = 32, Ville = "Paris", CodeP = "1301",
[Column("ID")] Personne = personne};
[Key] // on persiste l'adresse
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] model.Adresses.Add(adresse);
personne.Adresses.Add(adresse);
public int Id { get; set; } model.SaveChanges();
[Column("LastName")]
[MaxLength(20),MinLength(2)] // on recupere le contenu de l’entite Personne
public string Nom { get; set; } var personQuery = from person in model.Personnes
[Column("FirstName")] select person;
// on affiche la personne
public string Prenom { get; set; } foreach (var p in personQuery) {
public int Age { get; set; } Console.WriteLine($"Bonjour { p.Prenom }
public ICollection<Adresse> Adresses { get; set; } { p.Nom }de{ p.Adresses.First<Adresse>().Ville}");}
public Personne(){Adresses = new List<Adresse>();}
} }
23/11/2021 97

Code First
Les relations bidirectionnelles
• Pour faire la modification
var personToBeUpdated = (from p in model.Personnes
where p.Nom.Equals("Pradel")
select p).First();
personToBeUpdated.Prenom = "Michel";
model.SaveChanges();

• Pour la suppression

Personne p2 = model.Personnes.First(p=> p.Id == 9);


model.Personnes.Remove(p2);
model.SaveChanges();
23/11/2021 98

Code First
La migration
• Si on veut ajouter une nouvelle colonne dans une table? (ou modifier la table d’une manière
plus générale)

• Une autre solution :


Utiliser la migration Code First
23/11/2021 99

Code First
La migration
Ajoutons l’attribut tel à la classe Personne
public class Personne{ Model1.cs
[Column("ID")]
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Column("LastName")]
[MaxLength(20),MinLength(2)]
public string Nom { get; set; }
[Column("FirstName")]
public string Prenom { get; set; }
public int Age { get; set; }
[MaxLength(10), MinLength(10)]
public string tel { get; set; }
public ICollection<Adresse> Adresses { get; set; }
public Personne(){Adresses = new List<Adresse>();}
}
23/11/2021 100

Code First
La migration
Mise en place de migrations
• Dans le menu Outils, aller dans Gestionnaire de package NuGet et sélectionner Console
du gestionnaire de paquet
Dans la console Console du Gestionnaire de Package
• Sélectionner le projet dans la liste Projet par defaut :
• Lancer la commande Enable-Migrations : ça génère un répertoire Migrations contenant un
fichier InitialCreate
• Lancer la commande Add-Migration add_column_tel_personne : ça génère un fichier
x_add_column_tel_personne.cs dans le répertoire Migrations
• Pour mettre à jour la base de données : lancer la commande Update-Database

PS: Si la commande Enable-Migrations ne marche pas (Cas EF 6.3.0) essayez un downgrade


Uninstall-Package EntityFramework -Verbose -ProjectName <Your_Project>
Install-Package EntityFramework -Version 6.2.0 -Verbose –ProjectName <Your_Project>
23/11/2021 101

Code First
La migration
Dans l’Explorateur d’Objet SQL Server
• Vérifier les mises à jour en allant dépliant la rubrique colonnes de la table Personne dans
Explorateur d’objets SQL Server
• Redémarrer si les changements n’apparaissent pas
23/11/2021 102

Code First
L’heritage

Supposons que l’on a :


• Une classe mère Personne
• Deux classes filles Etudiant et Enseignant qui étendent Personne.

Comment transformer ça en tables ? (3 Solutions possibles)


• Une seule table pour les trois classes : Table per Hierarchy (TPH)
• Une table pour chaque classe concrète : Table per Concrete Class (TPC)
• Une table indépendante pour chaque classe : Table per Type (TPT)
23/11/2021 103

Code First
L’heritage (Table per Hierarchy (TPH)) : Une seule table pour les trois classes
public class Personne
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[MaxLength(20),MinLength(2)]
public string Nom { get; set; }
public string Prenom { get; set; }
public int Age { get; set; }
}

public class Etudiant: Personne


{
public int Bourse { get; set; }
}

public class Enseignant: Personne


{
public int Salaire { get; set; }
}
23/11/2021 104

Code First
L’heritage (Table per Hierarchy (TPH)) : Une seule table pour les trois classes

public class Model3 : DbContext


{
public Model3(): base("name=Model3"){}
public virtual DbSet<Personne> Personnes { get; set;}
public virtual DbSet<Etudiant> Etudiants { get; set;}
public virtual DbSet<Enseignant> Enseignants { get;set; }
}
23/11/2021 105

Code First
L’heritage (Table per Hierarchy (TPH))
Dans le Main, on prépare les objets à persister
23/11/2021 106

Code First
L’heritage (Table per Hierarchy (TPH)) : Une seule table pour les trois classes
Allons voir la base de données
23/11/2021 107

Code First
L’heritage (Table per Hierarchy (TPH)) : Une seule table pour les trois classes

• Pour récupérer et afficher la liste des étudiants

var personQuery = from person in model.Etudiants


select person;
foreach (var p in personQuery) {
Console.WriteLine($"Bonjour { p.Prenom } { p.Nom };
}
// affiche Bonjour Michel Mary

• Pour récupérer et afficher la liste des enseignants

var personQuery = from person in model.Enseignants


select person;
foreach (var p in personQuery) {
Console.WriteLine($"Bonjour { p.Prenom } { p.Nom };
}
// affiche Bonjour Roger Hanin
23/11/2021 108

Code First
L’heritage (Table per Concrete Class (TPC)) : Une table pour chaque classe concrète
public abstract class Personne
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] La classe Personne est
public int Id { get; set; } maintenant abstraite.
[MaxLength(20),MinLength(2)]
public string Nom { get; set; }
public string Prenom { get; set; }
public int Age { get; set; }
}
[Table("Etudiant")]
public class Etudiant: Personne
{ On ajoute le décorateur [Table]
public int Bourse { get; set; } aux classes filles.
}
[Table("Enseignant")]
public class Enseignant: Personne
{
public int Salaire { get; set; }
}
23/11/2021 109

Code First
L’heritage (Table per Concrete Class (TPC)) : Une table pour chaque classe concrète

public class Model3 : DbContext


{
public Model3(): base("name=Model3"){}
public virtual DbSet<Etudiant> Etudiants { get; set;}
public virtual DbSet<Enseignant> Enseignants { get;set; }
}
23/11/2021 110

Code First
L’heritage (Table per Concrete Class (TPC))
Dans le Main, on prépare les objets à persister
23/11/2021 111

Code First
L’heritage (Table per Concrete Class (TPC)) : Une table pour chaque classe concrète
Allons voir la base de données
23/11/2021 112

Code First
L’heritage (Table per Type (TPT)): Une table indépendante pour chaque classe
public class Personne
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] La classe Personne
public int Id { get; set; } n’est plus abstraite.
[MaxLength(20),MinLength(2)]
public string Nom { get; set; }
public string Prenom { get; set; }
public int Age { get; set; }
}
[Table("Etudiant")]
public class Etudiant: Personne
{ On ajoute le décorateur [Table]
public int Bourse { get; set; } aux classes filles.
}
[Table("Enseignant")]
public class Enseignant: Personne
{
public int Salaire { get; set; }
}
23/11/2021 113

Code First
L’heritage (Table per Type (TPT)): Une table indépendante pour chaque classe

public class Model3 : DbContext


{
public Model3(): base("name=Model3"){}
public virtual DbSet<Personne> Personnes { get; set;}
public virtual DbSet<Etudiant> Etudiants { get; set;}
public virtual DbSet<Enseignant> Enseignants { get;set; }
}
23/11/2021 114

Code First
L’heritage (Table per Type (TPT))
Dans le Main, on prépare les objets à persister
23/11/2021 115

Code First
L’heritage (Table per Type (TPT)): Une table indépendante pour chaque classe
Allons voir la base de données
23/11/2021 116

Database First
• Nous disposons d’une base de données
• Nous allons donc générer les entités qui correspondent au schema relationnel
existant
• Ensuite utiliser LINQ to Entities pour manipuler la base de données

Etapes à suivre:
• Création d’un projet Console
• Intégrer Entity Framework dans le projet
• Générer les entités
• Manipuler les données avec LINQ to Entities
23/11/2021 117

Database First
On va importer la base de donnees du premier model code first (Model1) avec la classe
personne et address.
• Clic droit sur le projet, Ajouter > Nouvel élément
• Dans Eléments Visual C#, cliquer sur Données et sélectionner ADO.NET Entity Data Model
• Saisir MonModele dans Nom puis Valider
• Choisir EF Designer à partir de la base de données
• Cliquer sur Nouvelle connexion
• Sélectionner Microsoft SQL Server puis cliquer sur Continuer
• Dans Le nom du serveur, saisir (localdb)\MSSQLLocalDB
• Cliquer sur le bouton radio Attacher un fichier de base de données, et sélectionner le
fichier .mdf portant le nom de la base de données précédente (situé dans
c:/utilisateurs/utilisateurCourant)
• Vérifier que la connexion avec la base de données est fonctionnelle en cliquant sur Tester la
connexion
23/11/2021 118

Database First
On va importer la base de données du premier model code first (Model1) avec la classe
personne et address.
• Cliquer sur Ok ensuite sur Suivant >
• Valider la copie du fichier dans le projet
• Déplier la rubrique Tables et sélectionner les tables à importer
• Cocher la case correspondante à la génération des noms en singulier et au pluriel
• Cliquer sur Terminer

Verifier que :
• Les entités ont bien été générées
• La classe MonModele (contexte) a été ajoutée aussi
23/11/2021 119

Database First
On va importer la base de données du premier model code first (Model1) avec la classe
personne et address.
• Cliquer sur Ok ensuite sur Suivant >
• Valider la copie du fichier dans le projet
• Déplier la rubrique Tables et sélectionner les tables à importer
• Cocher la case correspondante à la génération des noms en singulier et au pluriel
• Cliquer sur Terminer

Verifier que :
• Les entités ont bien été générées
• La classe MonModele (contexte) a été ajoutée aussi
23/11/2021 120

Database First
Dans le Main, on prépare les objets à persister

using (var db = new Model1Context()){


var adresse = new Adress
{Rue = 13, Ville = "Lyon", CodeP = "69007"};
var personne = new personne()
{LastName = "Jeavons", FirstName = "Jacob", Age = 35};
personne.Adresses.Add(adresse);
db.personnes.Add(personne);
db.SaveChanges();
var persoQuery = from perso in db.personnes
select perso;
foreach (var p in persoQuery) {
Console.WriteLine($"Bonjour {p.FirstName}{ p.LastName} de {p.Adresses.First<Adress>().Ville}");
}
23/11/2021 121

Model First
Model First
• Pas de base de données
• Pas d’entités

Solution
• On crée un modèle graphique (de classes)
• et on génère les entités et la base de données
23/11/2021 122

Model First

Etapes à suivre
• Création d’un projet Console
• Intégrer Entity Framework dans le projet
• Créer le modèle (créer des entités graphiquement)
• Générer la base de données
• Manipuler les données avec LINQ to Entities
23/11/2021 123

Model First
Pour créer le modèle
23/11/2021 124

Model First
Pour créer une entité

Pour renommer une entité


23/11/2021 125

Model First
Autres opérations
23/11/2021 126

Model First
Pour générer la base de données
23/11/2021 127

Model First
La base de données n’existe pas
23/11/2021 128

Model First
Aller dans l’Explorateur d’Objet SQL Server
• Vérifier la création de la base de données

Aller dans l’Explorateur de solutions


• Vérifier l’existence de deux entités
• Vérifier la création de la classe contexte
23/11/2021 129

WCF
23/11/2021 130

WCF: Windows Communication Foundation


23/11/2021 131

WCF : Exemple par défaut


Un premier projet WCF
• Dans le menu Fichier, aller dans Nouveau > Projet
• Choisissez WCF et sélectionner Application de service WCF
• Saisir un nom pour le projet et un pour la solution et valider

Remarques
• Pas de Program.cs dans le projet, ni la méthode principale Main
• Présence de deux fichiers Service1.svc et IService1.cs
23/11/2021 132

WCF: Exemple par défaut


Contenu de l’interface IService1
23/11/2021 133

WCF
Contenu du CompositeType
23/11/2021 134

WCF: Exemple par défaut


Contenu de la classe Service1 qui implémente IService1
23/11/2021 135

WCF: Exemple par défaut


Pour tester
23/11/2021 136

WCF: Exemple
• On veut créer une méthode qui calcule la somme de deux entiers.
• Dans l’interface IService1 il faut ajouter

• Dans la classe Service1, il faut ajouter l’implémentation

Testez !
23/11/2021 137

WCF : Exemple
Création d’un client d’un service WCF
23/11/2021 138

WCF : Exemple
Référencer le service dans le nouveau projet
23/11/2021 139

WCF : Exemple
Contenu du client
using ClientWCF.ServiceReference1;
namespace ClientWCF
{
class Program
{
static void Main(string[] args)
{
var client = new ServiceReference1.Service1Client();
int a = 7;
int b = 3;
int result = client.Somme(a, b);
Console.WriteLine($"la somme de {a} et {b} est {result}");
Console.ReadKey();
client.Close();
}
}
}
Etapes de mise en œuvre de WCF
• 1ère étape : Définition du contrat
On définit les signatures des méthodes composant le service WCF, et le format
des données à échanger.
• 2 ème étape : Implémentation du contrat
On implémente les services.
• 3ème étape : Configuration du service
On définit les EndPoints, c-à-d les points d’accès au service
• 4ème étape : Hébergement des services dans une application .NET

Puis, il ne reste plus qu’à créer une application cliente (quelque soit sa forme,
Windows, Web, …) qui pourra utiliser le service WCF
Les éléments A B C

WCF repose sur trois éléments :


• Adresse : adresse à laquelle le client doit se connecter pour utiliser le service.
• Binding : protocole utilisé par le client pour communiquer avec le service.
• Contrat : infos échangées entre le serveur et le client afin que ce dernier sache
comment utiliser le service.
Espaces de nom du Framework .NET
La mise en œuvre de WCF repose principalement sur 2 espaces de nom du
Framework .NET :
• System.ServiceModel
• System.Runtime.Serialization
23/11/2021 143

Création d’un service WCF


Etape 1 : Définition du contrat de service
 Le contrat de service est l’entité qui va :
• Etre échangée entre le serveur et le client ;
• Permettre au client de savoir quelles sont les méthodes proposées par le service et
comment les appeler
• C’est une Interface, au sens objet du terme, décorée de quelques attributs spécifiant qu'il
s'agit d'un contrat WCF

 L’élaboration d’un contrat de service s’effectue au travers des 4 métadonnées


suivantes :
• ServiceContract
• OperationContract
• DataContract
• DataMember
Etape 1 : Définition du contrat de service
 ServiceContract
• Cette métadonnée est attachée à la définition d’une classe ou, d’une interface. Il sert à indiquer
que la classe ou l’interface est un contrat de service.
 OperationContract
• Cette métadonnée est attachée aux méthodes que l’on souhaite exposer au travers du service
WCF. Ainsi, il est techniquement possible de n’exposer au client que quelques méthodes d’une
classe.
 DataContract
• Cette métadonnée est attachée à la définition d’une classe. Il sert à indiquer que la classe définit
les objets que l’on va devoir passer en paramètre au service, ou que celui-ci va devoir nous
retourner.
 DataMember
• Cet attribut se place avant les propriétés des classes qui définissent les objets que l’on va devoir
passer en paramètre au service, ou que celui-ci va devoir nous retourner
• Une propriété qui n’est pas dotée de cet attribut ne peut pas être envoyée ou reçue par WCF
Mise en oeuvre
• Soit un service qui permet de réaliser les opérations suivantes :
• Retourne une chaine de caractères
• Calcul de la somme de 2 nombre entiers
• Calcul du produit scalaire de deux vecteurs

• On commence :
• Créez une nouvelle solution, et un nouveau projet service WCF
• Dans le dossier App_Code renommez les fichiers Service et IService en
MonService et Icontrat
• Ouvrez les deux fichiers et modifiez-les
Exemple
namespace ProjetContrat L’interface qui a un
{ contrat de service
[ServiceContract]
public interface IContrat
{
[OperationContract]
string bonjour(string nom);
Méthodes exposées
[OperationContract] au travers du service
int somme(int a, int b); au client
[OperationContract]
double produitScalaire(Vecteur v1, Vecteur v2);

}
Exemple
namespace ProjetContrat Définition d’une classe
{
[DataContract]
public class Vecteur
{
[DataMember]
public double X { get; set; } Propriétés des classes
[DataMember]
public double Y { get; set; }
}
}
Etape 2: Implémentation du contrat
Le Service: Il s’agit d’une classe qui implémente le contrat, cette classe fournit
l’implémentation du service
public class MonService : IContrat
{
public int somme(int a, int b)
{
return a + b;
}
public string bonjour(string nom)
{ Testez les trois
return "bonjour " + nom; méthodes avec
} le simulateur
public double produitScalaire(Vecteur v1, Vecteur v2) client.
{
double r = (v1.X * v2.X) + (v1.Y * v2.Y);
return r;
}
}
23/11/2021 150

Héberger le service WCF


Hébergement du service
• L’hébergement du service peut se faire dans une application WindowsForms
ou une application Console
• Cette application doit contenir un fichier de configuration app.config dans
lequel sont spécifiés :
• Le contrat du service
• Le Binding du service
• L’adresse du service
Le Binding
 C’est le protocole, utilisé pour communiquer avec le service WCF
 Le Framework .Net 4.0 nous fournit à la base 9 bindings que l'on peut utiliser directement.
 Ces bindings ont des caractéristiques différentes. Ils offrent de nombreuses fonctionnalités
avancées et couvrent ainsi de nombreux scénarios d'utilisation.
 Voici la liste des bindings inclus dans WCF :
• BasicHttpBinding
• WSHttpBinding
• WSDualHttpBinding
• WSFederationHttpBinding
• NetTcpBinding
• NetNamedPipeBinding
• NetMsmqBinding
• NetPeerTcpBinding
• MsmqIntegrationBinding
L’Adresse
 Il s'agit simplement d'une URI qui définit où est joignable le service: par
exemple une URL http
 La nature de l'adresse dépend du protocole choisit et de l'infrastructure
réseau.
 Dans un fichier de configuration app.config, on définit des services
 chaque service possède un nom et peut avoir un ou plusieurs EndPoints
(points d’accès)
 Chaque EndPoint possède :
• Une adresse
• Un binding
• Un contrat
Etape 3: configuration du service
<configuration> web.config
<system.serviceModel>
<services>
<service name="ProjetContrat.MonService">
<endpoint
address="http://localhost:9000/MonService"
contract="ProjetContrat.IContrat"
binding="basicHttpBinding"
/>
<endpoint
address="net.tcp://localhost:9001/MonService"
contract="ProjetContrat.IContrat"
binding="netTcpBinding"
/>
</service>
</services>
</system.serviceModel>
</configuration>
23/11/2021 155

Consommer le service WCF


Application Cliente
Etape 4: Hébergement du service
Application Cliente
• Un client peut être developpé en java, dotnet, php….
• Cependant, les binding déjà évoqués ne sont pas tous interopérables
• L’application cliente doit faire référence à :
• System.ServiceModel
• L’interface (c-à-d le contrat)
Application Cliente
• L’objet central du client est le ChannelFactory
• Il permet au client d’envoyer et/ou recevoir des informations du serveur.

ChannelFactory<IContrat> channel = null;


IContrat service = null;
public Form1()
{
InitializeComponent();
channel = new ChannelFactory<IContrat>("conf1");
service = channel.CreateChannel();
// …
}
Application Cliente
• Dans la même solution créez une nouvelle application Windows Forms et
référencer :
• System.ServiceModel
• L’interface (c-à-d le contrat) (click-droit sur le projet ajout de référence service )
using System.ServiceModel;
using testWCF.ServiceReference1;

ChannelFactory<IContrat> channel = null;


IContrat service = null;
public Form1()
{
InitializeComponent();
channel = new ChannelFactory<IContrat>("BasicHttpBinding_IContrat");
service = channel.CreateChannel();
lbonj.Text = service.bonjour("Sara");
}
Application Cliente
<configuration> App.config
<system.serviceModel>
<client>
<endpoint
address="http://localhost:17933/Service.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IContrat"
contract="ServiceReference1.IContrat"
name="BasicHttpBinding_IContrat"
/>
</client>
</system.serviceModel>
</configuration>
23/11/2021 160

Application Cliente

Vous aimerez peut-être aussi