Programmation vb.net multi couche

Signaler
Messages postés
71
Date d'inscription
jeudi 7 juillet 2011
Statut
Membre
Dernière intervention
27 novembre 2017
-
Messages postés
14774
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
7 mars 2021
-
Bonjour je viens de me mettre à la programmation multi-couche en vb.net et ado.net je pense avoir compris les liens entre chaque couche mais c'est la construction des classes qui me posent problème.

J'ai 4 couche : IHM (interface homme - machine), DAL (accès aux données), BEL (objet métier) et BPL (règle de gestion, appel des fonctions du DAL)

J'ai une table Access nommé User, j'ai donc crée mon interface pour en ajouter un enregistrement (IHM).

Public Class Inscription
 
    Private Sub Binscription_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Binscription.Click
        'vide
    End Sub
End Class


DAL, une classe pour la connexion :
' Ajout référence : Microsoft ADO Ext. 2.8 for DDL and Security
 
Public Class AccessConnexion
    'attribut chemin de la base
    Private chemin As String
    'Attribut connexion unique à une source de données
    Private cnx As OleDb.OleDbConnection
    'Attribut chaine de connection (fournisseur d'accès aux données + chemin)
    Private cnxstr As String
 
    'retourne vrai si le fichier (base) existe
    Public Function verif_chemin() As Boolean
        Return System.IO.File.Exists(chemin)
    End Function
 
    Public Sub Initialise_connexion()
        chemin = My.Application.Info.DirectoryPath & "\Data_base.accdb"
        cnxstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & chemin & ";"
    End Sub
 
    Public Sub Create_base()
        'base de donnée
        Dim db As New ADOX.Catalog
        Try
            db.Create(cnxstr)
        Catch ex As Exception
            Throw New Exception("Erreur de création de la base" & Environment.NewLine & ex.Message)
        End Try
    End Sub
 
    Protected Sub Open_connexion()
        Try
            'test si la connexion n'est pas déjà ouverte
            If cnx.State <> 1 Then
                cnx = New OleDb.OleDbConnection
                cnx.ConnectionString = cnxstr
                cnx.Open()
            End If
        Catch ex As Exception
            Throw New Exception("Erreur d'ouverture connexion" & Environment.NewLine & ex.Message)
        End Try
    End Sub
 
    Protected Sub Close_connexion()
        Try
            'test si la connexion n'est pas déjà fermer
            If cnx.State <> 0 Then
                cnx.Close()
            End If
        Catch ex As Exception
            Throw New Exception("Erreur fermeture connexion" & Environment.NewLine & ex.Message)
        End Try
    End Sub
 
End Class


une autre pour la table User (c'est la que je bloque un peu beaucoup) je ne vois pas trop comment je dois organisé cela
Public Class AccessUsers
    'vide
End Class


BEL, instanciation des objet
Public Class USERS
 
#Region "Attributs"
    Private User_login As String
    Private User_password As String
    Private User_question As String
    Private User_reponse As String
#End Region
 
#Region "Property"
 
    Public Property Login() As String
        Get
            Return User_login
        End Get
        Set(ByVal value As String)
            User_login = value
        End Set
    End Property
 
    Public Property Password() As String
        Get
            Return User_password
        End Get
        Set(ByVal value As String)
            User_password = value
        End Set
    End Property
 
    Public Property Question() As String
        Get
            Return User_question
        End Get
        Set(ByVal value As String)
            User_question = value
        End Set
    End Property
 
    Public Property Reponse() As String
        Get
            Return User_reponse
        End Get
        Set(ByVal value As String)
            User_reponse = value
        End Set
    End Property
 
#End Region
 
    Public Sub New(ByVal Login As String, ByVal Password As String, ByVal Question As String, ByVal Reponse As String)
        User_login = Login
        User_password = Password
        User_question = Question
        User_reponse = Reponse
    End Sub
End Class


et la couche BPL, celle-ci est vide pour l'instant mais je vois comment elle fonctionne (appel de fonction de la classe AccessUser dans DAL)

Donc en faite ma principale question serait comment mettre en forme la classe AccessUser de la DAL ?

2 réponses

Messages postés
71
Date d'inscription
jeudi 7 juillet 2011
Statut
Membre
Dernière intervention
27 novembre 2017

quelque changement :

IHM
'ajout référence vers BEL
Imports BEL
'ajout référence vers BEL
Imports BPL


Public Class Inscription

    Private Sub AjouterUser(ByVal login As String, ByVal password As String, ByVal question As String, ByVal reponse As String)
        Dim NewUser As USER = New USER(login, password, question, reponse)
        Dim UserBPL As New BPL.BPLuser
        UserBPL.BPL_Ajouter(NewUser)
    End Sub


    Private Sub Binscription_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Binscription.Click
        AjouterUser(TBlogin.Text, TBpassword.Text, CBquestion.SelectedText, TBlogin.Text)
    End Sub

End Class


BPL
'ajout référence vers la BEL
Imports BEL
'ajout référence vers la DAL
Imports DAL

Public Class BPLuser

    'Envoie de l'objet metier à la DAL pour l'ajout de l'utilisateur
    Public Sub BPL_Ajouter(ByVal NewUser As USER)
        Dim UserDAL As New DAL.AccessUsers
        UserDAL.Ajouter(NewUser)
    End Sub

End Class


Mais se qui me manque c'est toujours comment mettre en place ma classe AccessUser dans la DAL
Messages postés
14774
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
7 mars 2021
151
Bonjour,

Ta question demande réflexion (dans le sens réfléchir, pas la Reflection de NET ;) ).

Ton soucis est clair, voici quelques idées :
- Une classe "singleton" (Design pattern) permettant l'accès à la base de données, cette classe s'initialise et se détruit toute seule.
- Cette classe listera un certains nombre d'objet enfant représentant les objets logiques (Utilisateur, ...). Ces objets hériteront ou implémenteront une interface/classe afin de rendre leur accès générique si besoin. Ils auront des méthodes d'ajout/suppression/modification et lecture, utilisant une ou plusieurs classes pour représenter les données extraites.
- Les élément d'IHM nécessitant un accès à la base de données accèderont à la base de données via son singleton et récupèreront les données via les objet mis à disposition.

Exemple :
Dim MonUtilisateur As ClsUser=New ClsUser(Nom,Prenom, ...)

MaBase.Singleton.Utilisateur.Ajout(MonUtilisateur)

Il y a la possibilité des génériques aussi pour la classe/interface mère des objets d'accès.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site