Je reviens à la charge avec ces histoire de DTO et de POCO.
Histoire de parler un exemple concret, voici un "bête" exemple de DTO (et des parsers qui vont avec en référence à la série d'articles de R. Lacovara)
Les DTO's :
Les parsers :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
27
28
29
30
31
32
33
34
35
36 Public Class BaseDTO Public Property IsNew As Boolean End Class Public Class AnimalDTO Inherits BaseDTO Public Sub New(age As Integer, nom As String) Me.Age = age Me.Nom = nom End Sub Public Property Age As Integer Public Property Nom As String End Class Public Class SerpentDTO Inherits AnimalDTO Public Sub New(age As Integer, nom As String, nombreMue As Integer) MyBase.New(age, nom) Me.NombreMue = nombreMue End Sub Public Property NombreMue As Integer End Class Public Class ChienDTO Inherits AnimalDTO Public Sub New(age As Integer, nom As String, nombrePortee As Integer) MyBase.New(age, nom) Me.NombrePortee = nombrePortee End Sub Public Property NombrePortee As Integer End Class
Alors déjà là, j'ai un doute. Aurais-je dû faire hériter les class SerpentParser et ChienParser de AnimalParser ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 Public Interface IParser Sub PopulateOrdinals(reader As SqlClient.SqlDataReader) Function PopulateDTO(reader As SqlClient.SqlDataReader) As BaseDTO End Interface Public Class AnimalParser Implements IParser Private ord_age, ord_nom, ord_portee As Integer Public Function PopulateDTO(reader As System.Data.SqlClient.SqlDataReader) As BaseDTO Implements IParser.PopulateDTO If IsDBNull(reader.GetInt32(ord_portee)) Then Dim prs_serpent As New SerpentParser prs_serpent.PopulateOrdinals(reader) Return CType(prs_serpent.PopulateDTO(reader), SerpentDTO) Else Dim prs_chien As New ChienParser prs_chien.PopulateOrdinals(reader) Return CType(prs_chien.PopulateDTO(reader), ChienDTO) End If Return Nothing End Function Public Sub PopulateOrdinals(reader As System.Data.SqlClient.SqlDataReader) Implements IParser.PopulateOrdinals reader.GetOrdinal("age") reader.GetOrdinal("nom") reader.GetOrdinal("portee") End Sub End Class Public Class SerpentParser Implements IParser Private ord_age, ord_nom, ord_mue As Integer Public Function PopulateDTO(reader As System.Data.SqlClient.SqlDataReader) As BaseDTO Implements IParser.PopulateDTO Return New SerpentDTO(reader.GetInt32(ord_age), reader.GetString(ord_nom), reader.GetInt32(ord_mue)) End Function Public Sub PopulateOrdinals(reader As System.Data.SqlClient.SqlDataReader) Implements IParser.PopulateOrdinals ord_age = reader.GetOrdinal("age") ord_nom = reader.GetOrdinal("nom") ord_mue = reader.GetOrdinal("mue") End Sub End Class Public Class ChienParser Implements IParser Private ord_age, ord_nom, ord_portee As Integer Public Function PopulateDTO(reader As System.Data.SqlClient.SqlDataReader) As BaseDTO Implements IParser.PopulateDTO Return New ChienDTO(reader.GetInt32(ord_age), reader.GetString(ord_nom), reader.GetInt32(ord_portee)) End Function Public Sub PopulateOrdinals(reader As System.Data.SqlClient.SqlDataReader) Implements IParser.PopulateOrdinals ord_age = reader.GetOrdinal("age") ord_nom = reader.GetOrdinal("nom") ord_portee = reader.GetOrdinal("portee") End Sub End Class
Viennent ensuite le tour des POCO's.
A priori, j'écrirai celui pour Animal comme ceci :
Et ensuite, je bloque... Rien qu'à l'idée du constructeur de ChienPOCO, je cale. Le constructeur de ChienPOCO va demander un objet de type ChienDTO en paramètre. Mais ce même constructeur doit passer un AnimalDTO au constructeur de sa classe de base.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Public Class AnimalPOCO Public Property DTO As AnimalDTO Public Sub New(dto As AnimalDTO) Me.DTO = dto End Sub Public Sub SaveAnimal() End Sub Public Sub DeleteAnimal() End Sub Public Sub FetchAnimal() End Sub Public Sub FetchAnimalByName() End Sub End Class
Autant pour une classe "normale", je pense avoir bien pigé (si mes DTO's sont corrects), autant pour un poco, cale méchamment.
Et j'avoue même avoir du mal à exprimer sur quoi je bloque...
Quelqu'un aurait-il l'amabilité de prendre 5 minutes pour compléter l'exemple et fournir les classes POCO correctes ? J'ai tenté de trouvé des exemples sur la toile mais je ne trouve que des trucs en rapport avec EF4.
Partager