Le Tech'Ed 2005 commence aujourd'hui pour les personnes participantes aux pré-conférence. La conférence se déroule comme l'année dernière à Amsterdam et réunit plusieurs milliers de personnes venant de toute l'europe.
Plusieurs pré-conférences sont accessibles, et je suis en train d'assister à celle traitant d'ASP.net 2 et présentée par Jeff Prossise (Wintellect) un des plus grands experts ASP.net qui travaille en collaboration étroite avec les équipes de développement de Microsoft.

Et si je poste dès maintenant alors que la session se termine en fin de journée, c'est que j'ai failli m'étrangler en regardant la démonstration sur ObjectDataSource. L'ObjectDataSource est un nouveau contrôle source de données proposé par le framework .net 2 qui permet de binder des contrôles (un gridview par exemple) directement avec des objets métiers sans passer par des objets liés aux données comme les dataset, datareader, etc...
Et comme d'habitude sur ce que l'on peut voir sur le net ou même dans les MOC officiels de Microsoft (!), Jeff Prosise utilisa l'ObjectDataSource pour binder un gridview avec... un DATASET !!! grrr...arrgghhh....
Regardons le code suivant :
1: using System;
2: using System.Collections.Generic;
3: using System.Text;
4:
5: namespace SupinfoProjects.Domain
6: { 7: public class Ecole
8: { 9: private string m_name;
10: private int m_id;
11:
12: public string Name
13: { 14: get { return m_name; } 15: set { m_name = value; } 16: }
17:
18: public int Id
19: { 20: get { return m_id; } 21: set { m_id = value; } 22: }
23:
24: //Obligatoire pour l'ObjectDataSource
25: public Ecole()
26: {} 27:
28: public Ecole(int id, string name)
29: { 30: m_name = name;
31: m_id = id;
32: }
33: }
34: }
Voilà pour notre objet métier, ensuite au niveau de notre DAL :
1: using System;
2: using System.Collections.Generic;
3: using System.Text;
4: using System.Data;
5: using System.Data.SqlClient;
6: using SupinfoProjects.Domain;
7: using SupinfoProjects.DAL.Factories;
8:
9: namespace SupinfoProjects.DAL
10: { 11: public class EcolesDAO
12: { 13:
14:
15: public static IList GetAllEcoles()
16: { 17:
18: List schools = new List();
19:
20: try
21: { 22: GenericCommand cmdGetEcoles = new GenericCommand();
23: cmdGetEcoles.CommandText = "getAllEcoles";
24:
25: SqlDataReader rdEcoles = cmdGetEcoles.ExecuteReader();
26:
27: if (rdEcoles.HasRows)
28: while (rdEcoles.Read())
29: schools.Add(new Ecole((int)rdEcoles[0], rdEcoles[1].ToString()));
30:
31: rdEcoles.Close();
32: cmdGetEcoles.Dispose();
33:
34: }
35: catch (SqlException sqlex)
36: { 37: throw new Exceptions.DataAccessException("ca a merde", sqlex); 38: }
39: catch (Exception)
40: { 41:
42: }
43: return schools;
44: }
Dans la couche service :
1: using System;
2: using System.Collections.Generic;
3: using System.Text;
4: using SupinfoProjects.Domain;
5: using SupinfoProjects.BLL.Exceptions;
6:
7: namespace SupinfoProjects.BLL.Admin
8: { 9: public class EcoleFactory
10: { 11:
12: public static IList GetEcoles()
13: { 14:
15: try
16: { 17: return DAL.EcolesDAO.GetAllEcoles();
18: }
19: catch (DAL.Exceptions.DataAccessException dae)
20: { 21:
22: throw new ServiceException("Erreur lors de la récupération de la liste des ecoles", dae); 23: }
24: }
Au niveau de notre IHM, dans une page aspx :
1: <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource2" AutoGenerateColumns="False">
2: <Columns>
3: <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
4: <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" Visible="False" />
5: <asp:BoundField DataField="Name" HeaderText="Nom de l'école" SortExpression="Name" />
6: < SPAN>Columns>
7: < SPAN>asp:GridView>
8: <br />
9:
10: <asp:ObjectDataSource ID="ObjectDataSource2" runat="server" TypeName="SupinfoProjects.BLL.Admin.EcoleFactory" SelectMethod="GetEcoles" DataObjectTypeName="SupinfoProjects.Domain.Ecole" DeleteMethod="DeleteEcole" InsertMethod="CreateEcole" UpdateMethod="UpdateEcole">
11: < SPAN>asp:ObjectDataSource>
N'est-ce pas beaucoup plus élégant et beaucoup plus pertinent ? Je n'arrive vraiment pas à comprendre que l'on puisse parler de SQL, de dataset, lorsque l'on traite de l'ObjectDataSource.
Le framework .net 2 apporte plusieurs éléments fondamentaux améliorant les fonctionnalités objets que cela soit au niveau des langages (support des génériques par exemple), ou via l'ObjectDataSource. Pourquoi s'en priver et continuer à développer comme avant ?