IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Architecture Discussion :

Comment bien architecturer sa couche métier ?


Sujet :

Architecture

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 34
    Points
    34
    Par défaut Comment bien architecturer sa couche métier ?
    Bonjour à tous,

    Je suis en train de développer une application en WinForms (C#) mais peu importe le langage en fait car j'ai besoin d'aide pour l'architecture de l'application.
    Je vous explique : ma couche d'accès aux données (DAL) me retourne des objets simples (POJO en Java) du type : Commande (données membres : id, numéro, date de commande, etc) ou LigneCommande (id, Article, Nombre, etc). Donc, par exemple, j'ai une méthode (au niveau de la couche DAL) "chargeCommande(int id)" qui me retourne un objet Commande. Jusque là tout va bien, tout est séparé proprement avec des interfaces et une factory.

    Le problème vient au niveau de la communication entre la couche présentation et la couche métier (BLL).
    Exemple: au niveau de ma couche présentation, lorsque je supprime une ligne de commande, j'affiche toujours cette ligne de commande à mon utilisateur mais je lui grise pour lui montrer qu'elle est supprimée (inutile de vouloir changer cela car c'est une contrainte de mon cahier des charges :-)). Le problème, c'est qu'au niveau de mon objet LigneCommande, je ne peux pas lui stocker cette information (objet supprimé et à supprimer dans la base de données lorsque l'utilisateur enregistrera). Idem lorsque je fais des modifications au niveau d'une ligne de commande, j'aimerai mettre un flag pour lui dire, par la suite, de sauvegarder cette LigneCommande dans ma base de données (inutile de re-sauvegarder les LigneCommande non modifiée). Je prend deux exemples simples mais j'ai besoin d'ajouter d'autres infos sur mes objets de base pour la gestion de mon interface.

    Donc comment faire ? J'ai lu qu'il y avait des possibilités avec des DTOs mais je n'ai pas trouvé d'exemples à ce sujet.
    Pouvez-vous me dire comment vous faites de votre côté ?

    J'espère avoir été clair et je vous remercie par avance de vos réponses !
    Bon w-e à tous
    Luc
    "De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent" (Desproges)

  2. #2
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    Il faut considérer le pattern MVC où le M va être spécifique de ta couche Présentation. Peu importe comment tu communiques avec ta couche métier (objet métier ou DTO comme tu le dis), il faut que sur ta couche Présentation tu ais des "objets métier adaptés". C'est au niveau de ces objets que tu gèreras tes flags "détruit / pas détruit", "modifié / pas modifié".
    Ensuite se pose la problématique de comment créer ces objets. Peut être que le plus simple est de faire de la délégation vers l'objet qui est renvoyé par ta couche métier. Ton objet, côté Prés., possède les même "accesseurs" (get/set) que ton objet provenant de la couche métier. Pour ces set/get, il délègue à l'instance qui lui a été envoyée. Pour le reste, c'est à dire les flags, il gère en propre des attributs dédiés.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    Bonjour ego,
    Tout d'abord merci d'avoir pris le temps de répondre !
    Peux-tu me donner un exemple au niveau code (par exemple) de ce que cela pourrait donner ?
    Mon objet de la couche présentation est il égale à mon objet métier + données supplémentaires (style estModifie, estNouveau) ? Dans ce cas, je dois faire des adapters pour convertir ces objets d'une couche à l'autre ?

    Merci d'avance pour ta réponse
    Luc
    "De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent" (Desproges)

  4. #4
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    pour le code je vais voir...
    pour les adapters, oui tout à fait ! Tu fais ça à la main ou tu peux regarder Dozer en Java, côté C# je ne sais pas si ça existe

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    Si je résume ce que tu m'as dit :
    - j'ai un objet au niveau de ma couche métier (BLL) - LigneCommande (id, article, nombre)
    - j'ai un objet métier adapté pour ma couche présentation - LigneCommandePresentation(id, article, nombre, estNouveau, estModifie)

    Est ce que jusqu'ici j'ai bon ?

    Au niveau de ma couche BLL, j'ai deux méthodes :
    - ajouterLigneCommande(LigneCommande)
    - supprimerLigneCommande(LigneCommande)

    Donc si je pars sur ce principe, lorsque je clique sur "Enregistrer", je vais avoir quelque chose du style :
    parcours de toutes les LigneCommandePresentation
    si ligneCommandePresentation.estNouveau alors
    ajouterLigneCommande(ligneCommandePresentation)
    sinon si ligneCommandePresentation.estNouveau alors
    supprimerLigneCommande(ligneCommandePresentation)
    fsi
    au niveau du M de mon MVC.

    Mais du coup, où se gére ma transaction ? Toujours au niveau de mon M, j'appelle un méthode de la BLL qui dit "début de transaction" puis "fin de transaction" ?? Cela me parait un étrange.

    Merci de vos lumières.
    Luc
    "De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent" (Desproges)

  6. #6
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    côté "objet" ok
    Pour la partie "traitement"
    Tu as un "service" CommandeService
    CommandeService à tes 2 opérations ajouter et supprimer.

    - ajouter(LigneCommande ligne)
    Il faut passer une LigneCommande, pas un LigneCommandePresentation. C'est le rôle du contrôleur côté MVC qui se charge de faire le transvasement de LigneCommandePresentation vers une LigneCommande puis ce contrôleur fait appel à CommandeService.ajouter.
    C'est chaque méthode de CommandeService qui est "transactionnelle".
    Maintenant, je ne sais pas si tu veux pouvoir ajouter plusieurs LigneCommande dans une même transaction. Si oui, dans ce cas, il faut prévoir un ajouter(List<LigneCommande> lignes). Le contrôleur graphique ne doit pas gérer de transaction, c'est côté "service" que l'on doit faire cela.

    Pour le supprimer, il n'est nécessaire que de passer l'id de la LigneCommande (supprimer(Integer idLigneCommande) ) et prévoir de passer aussi plusieurs id si tu veux supprimer plusieurs LigneCommande dans une seule transaction

    En java, on pourrait avoir un code de ce genre

    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
    public class ControleurCommande {
    	CommandeService commandeService;
    
    	public void onValider() {
    		List<LigneCommandePresentation> lignes = recupererLignes();
    		List<LigneCommande> cmds = new ArrayList<LigneCommande>();
    		for (LigneCommandePresentation ligne : ligne) {
    			if (ligne.estModifie()) {
    				LigneCommande ligneCmd = convert(ligne);
    				cmds.add(ligneCmd);
    			}
    		}
    		if (cmds.size() > 0) {
    			try {
    			  commandeService.ajouter(cmds);
    			}
    			catch(ExceptionFonctionnelle ex) {
    			  // Afficher meesage erreur
    			}
    		}
    	}
    }

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/06/2009, 08h34
  2. Comment utiliser un publish/suscriber dans ma couche métier
    Par adrienfehr dans le forum Framework .NET
    Réponses: 5
    Dernier message: 14/05/2009, 11h57
  3. Architecture couche métier <-> couche présentation
    Par bozo614 dans le forum Visual C++
    Réponses: 7
    Dernier message: 22/11/2007, 17h11
  4. [EJB] Architecture couche métier + packaging
    Par st0ne dans le forum Java EE
    Réponses: 2
    Dernier message: 26/10/2007, 10h57
  5. Réponses: 1
    Dernier message: 05/09/2006, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo