Bonjour à tous,

J'aurais besoin de quelques conseils pour une bonne conception des couches et de leurs accès avec Linq To Sql en tant que couche DAL

Nous implémentons, dans notre projet actuel, Linq To Sql en tant que DAL. Il est clair que nous ne ferons quasiment pas de ORM autre que 1:1 (à part 1 ou 2 exeptions).

Les références sont les suivantes (classique de chez classique):

- La couche Factory connait la couche BO
- La couche BO connait la couche DAL mais pas la Factory
- La couche DAL ne connait personne

Avant de travailler avec Linq, j'avais dans ma DAL des objets DTO qui étaient créer en BO et envoyer aux méthodes d'insertion DB de la couche DAL. Ce qui me garantissait une clareté au niveau de mon code.
Tout ce qui touchait à l'insertion et extraction des données se trouvaient dans la DAL. Ma couche BO était donc "propre" de ce genre d'opération.

Mais maintenant que nous travaillons avec Linq To Sql, les choses se présentent de manière moins clair et moins "propre".

Pour expliquer mon cas, voici un exemple d'insertion d'un client

En BO
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 Client
....
 
    Public Shared Sub ChargerListeClient()
        Try
            For Each r In DAL.DALClient.getListeClients
                Dim oClt As Client = New BO.Client(r.Id_Client, r.Nom)
                listeClients.Add(oClt)
            Next
        Catch ex As Exception
            Throw ex
        End Try
 
    End Sub
 
    Public Shared Sub InsertNouveauClient(ByVal oClt As Client)
        Try
 
            Dim ctx As DAL.modeleMGTDataContext = New DAL.modeleMGTDataContext
            Dim _dalClient As DAL.Client = New DAL.Client
            _dalClient.Nom = oClt.Nom
            _dalClient.Prenom = oClt.Prenom
 
            ctx.SubmitChanges()
 
 
        Catch ex As Exception
            Throw ex
        End Try
 
 
    End Sub
 
....
End Class
En DAL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
Public Class DALClient
....
    Public Shared Function getListeClients() As IQueryable(Of Client)
        Dim ctx As modeleMGTDataContext = New modeleMGTDataContext
        Dim query = From c In ctx.Clients _
                    Select c
        Return query
    End Function
....
End Class
Vouc pouvez constater que lors d'un rappatriement de données, on peut respecter la référence des couches grâce à la collection IQueryable(Of .
Par contre pour l'insertion, je suis obligé de réaliser cette opération dans ma BO.

En travaillant de cette manière, je transforme ma couche BO comme étant également impactée par les problèmatiques d'accès aux données alors que cela ne devrait pas la concerner.

J'espère avoir été clair dans mes explications.

Quels sont vos conseils et expériences sur la chose.