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

ASP.NET Discussion :

Presentation, BLL et DAL : automatismes possibles ?


Sujet :

ASP.NET

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut Presentation, BLL et DAL : automatismes possibles ?
    Bonjour à tous,

    Dans mon projet, j'ai implémenté tout ce qu'il fallait coté DAL et BLL.
    Dans mon projet Web d'interface utilisateur, j'ai accès uniquement aux interfaces de mes services situés dans la BLL ainsi qu'à une classe Factory qui me renvoie des instances de mes services.
    Ce qui fait que coté présentation j'ai des appels à mes services du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ICategorieService CatServ = ServiceFactory.GetCategorieServiceInstance();
    Ce principe fonctionne très bien et permet de n'avoir que très peu de dépendance directe avec la couche BLL.

    Maintenant ma problématique se situe au niveau de l'utilisation de ces services dans les controles web.
    En effet, avant de refaire mon projet comme ceci, j'utilisais des objectdatasource qui allaient chercher directement mes services (donc les classes étaient accessibles de la couche BLL), ce qui facilitait énormément le travail avec les opération CRUD sur des listview et compagnie.

    Aujourd'hui je me retrouve juste avec des interfaces et une classe Factory qui me permet de récupérer mes instances. Je n'ai plus accès à cet automatisme qui m'aidait beaucoup à économiser le code-behind derriere chaque page (tout etait géré via les controles objectdatasource).
    Etant donné mon schéma de principe, pensez vous qu'il y ait un moyen simple de retrouver cet automatisme ? Comment faites vous en général sur des projets ayant la meme structure que le mien ?

    Merci d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Voici une proposition qui peut, peut etre, etre la plus intéressante dans mon cas :

    Je laisse ma BLL telle quelle : accessibilité de l'exterieur uniquement sur les interfaces de mes services et sur le ServicesFactory.

    Dans le projet de présentation (la couche web), je créé des Wrappers qui auront le triple avantage suivant :

    1) Je conserve une bonne séparation entre BLL et UI.
    2) Je peux ajouter les balises spécifiques au databinding sur mes wrappers (System.ComponentModel.DataObject et DataObjectMethod) ce qui me permet ensuite d'automatiser toute la partie CRUD entre service et présentation.
    3) On conserve un systeme de méthodes CRUD façon web : au lieu d'avoir un update(T objet) on a update(Int32 Id, String Nom) ce qui pour moi est plus interessant au niveau de la logique des couches.

    Perso avec ce systeme je n'ai qu'un mot en tete : Wonderfull
    Qu'en pensez vous ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Je comprends pas trop le problème... tu peux pas mettre simplement la méthode de ta Factory comme SelectMethod ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Salut Tomlev, tu as quitté les forums WPF ?

    Je ne peux pas mettre ma méthode de Factory en select car il manque une étape.

    Ma classe factory, c'est elle qui me retourne les instances de mes services.
    Ensuite dans chaque service tu as les méthodes CRUD classiques + celles qui sont spécifiques à chaque service.

    L'interet des wrappers c'est que je peux les utiliser directement dans des objectdatasources. Au niveau de l'objectdatasource, je lui donne comme source un de mes wrappers, puis je lui dit que dans ce wrapper, telle méthode est à utiliser pour le select, telle pour l'insert ...
    En mettant le factory comme source il me proposerait dans la liste des méthodes pour l'insert, update, delete uniquement les méthodes comme GetProductServiceInstance, GetCategoryServiceInstance ... tu vois le truc ?

    Edit : Je dis tout ca de façon sûre mais je ne suis pas fermé à toute suggestion bien entendu ! si tu as une proposition à faire, je suis preneur

  5. #5
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Et tu ne peux pas mettre ICategorieService comme source de données? J'ai jamais essayé de mettre une interface comme source de données objet.
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Euh, vous avez déjà utilisé les objectdatasources en ASP.Net ? à moins que j'ai raté un épisode, l'objectdatasource, tu lui donne le type de l'objet source à utiliser ainsi que les 4 noms de méthodes CRUD de cet objet et il se débrouille tout seul. Il l'instancie, et fait appel aux méthodes quand il y a besoin. Si je lui passe une interface je ne suis pas sur qu'il apprécie En fait il attend un objet ayant un constructeur sans parametre donc l'interface ne passera pas.

    Ah mais ça y est je vois de quoi vous parlez en fait non, je ne fais rien du tout moi, je n'instancie rien, je ne fais que paramètrer dans la couche présentation (sauf deux trois lignes par ci par la quand c'est nécessaire mais c'est tout). Donc meme pas besoin de passer par les interfaces. En fait j'utilise les interfaces et la classe factory de mes services dans les wrappers. Ensuite les wrappers sont pilotés et instanciés automatiquement par les objectDataSources.

  7. #7
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Et donc? Tu as essayé? Perso je l'ai jamais fait ça m'interesse. Tu peux surcharger les évènements lors de la connexion à la source de données. Il est possible que cela marche avec quelques interventions manuelles.
    "Winter is coming" (ma nouvelle page d'accueil)

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    A priori non car justement, avant d'avoir fait mes wrappers, je voulais justement faire ce que tu dis à savoir initialiser manuellement l'objectdatasource en utilisant les interfaces et la classe factory, mais j'ai l'impression que ce controle est très fermé. Il n'attend qu'un type d'objet à instancier et le reste il le fait tout seul. Je n'ai pas trouvé de propriété du genre Datasource sur un objectdatasource.
    Si tu en trouves une je suis preneur.

  9. #9
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par zax-tfh Voir le message
    Euh, vous avez déjà utilisé les objectdatasources en ASP.Net ?
    Oui oui, mais j'utilise simplement l'assistant de VS sans me poser trop de questions et je fais pointer les méthodes SELECT, ... aux méthodes du CRUD de ma BLL.

    Maintenant, si tu veux faire qqch de très générique tu devrais pouvoir mais il faut le faire avec un peu de code behind. N'utilise pas d'ObjetDataSource et assigne la datasource de ta gridview sur la méthode Load de ton interface.

    Sinon, on peut voir quel est le code de ton wrapper?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Immobilis, tu n'as pas honte ? tu utilises directement les objets de ta BLL dans ta couche presentation ? lol !
    Au départ, c'est ce que j'avais fait, mais comme je suis en train de pousser mon apprentissage de la coupure entre les couches, j'essaye de pousser le truc au maximum quoi.

    Donc dans ma BLL, j'ai uniquement mes interfaces de services + l'interface de base des services en public et ma classe factory aussi.
    Ensuite mes wrappers sont dans ce genre là :

    Classe abstraite de wrapper
    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
     
    [System.ComponentModel.DataObject()]
        abstract class AbstractServiceWrapper<T, IdT>
        {
            protected IService<T, IdT> _service = null;
     
            #region Constructeurs
     
            public AbstractServiceWrapper(IService<T, IdT> service)
            {
                _service = service;
            }
     
            #endregion
     
            #region SELECT
     
            [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, true)]
            public IList<T> GetAll()
            {
                return _service.GetAll();
            }
     
            #endregion
     
            #region DELETE
     
            [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Delete, true)]
            public void Delete(IdT Id)
            {
                T obj = _service.GetById(Id);
                if (obj != null)
                    _service.Delete(obj);
            }
     
            #endregion
        }
    Un wrapper
    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
     
    [System.ComponentModel.DataObject()]
        class CategoriesServiceWrapper : AbstractServiceWrapper<Categorie, Int32>
        {
            new protected ICategorieService _service;
     
            #region Constructeurs
     
            public CategoriesServiceWrapper(ICategorieService service)
                : base(service) { }
     
            public CategoriesServiceWrapper()
                : this(ServiceFactory.GetCategorieService()) { }
     
            #endregion
     
            #region SELECT
     
            [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, true)]
            public IList<Categorie> GetValidCategories()
            {
                return _service.GetValidCategories();
            }
     
            #endregion
     
            #region INSERT, UPDATE
     
            [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert, true)]
            public void Insert(String Nom, String Image, StatusCategorie Status)
            {
                Categorie cat = new Categorie();
                cat.Nom = Nom;
                cat.Image = Image;
                cat.Status = Status;
                _service.Save(cat);
            }
     
            [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Update, true)]
            public void Update(Int32 IdCategorie, String Nom, String Image, StatusCategorie Status)
            {
                Categorie cat = _service.GetById(IdCategorie);
                if (cat != null)
                {
                    cat.Nom = Nom;
                    cat.Image = Image;
                    cat.Status = Status;
                    _service.SaveOrUpdate(cat);
                }
            }
     
            #endregion
        }
    Je peux meme pousser le truc encore plus loin en intégrant l'insert et l'update dans la classe abstraite du wrapper et passer des objets en tant que parametre au lieu d'avoir chaque propriété mais avec Nhibernate que je ne maitrise pas encore, il me dis que j'ai deux objets ayant le même identifiant. J'ai essayé de faire comme indiqué sur le net à savoir surcharger GetHashCode et Equals mais ca ne passe toujours pas. De toute maniere, pour moi, ce n'est pas une bonne façon de faire. Ce probleme survient parce que j'ai deux objets identiques issus de deux requetes différentes et nhibernate n'arrive pas à faire le lien entre les deux. Et pour moi, l'objet a pu disparaitre de la base entre les deux requetes donc je prefere passer par les propriétés de l'objet mises en parametre des fonctions.

  11. #11
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par zax-tfh Voir le message
    Immobilis, tu n'as pas honte ? tu utilises directement les objets de ta BLL dans ta couche presentation ? lol !
    Bah non, puisque c'est fait pour ça... . L'IHM est en contact avec la BLL.
    Maintenant, tu peux encore ajouter une couche d'abstraction, mais j'ai bien peur que cela ne complique le modèle.

    Sinon, n'oublie pas de tester continuellement la performance de ton appplication. Les millisecondes perdues s'ajoutent les unes aux autres. Au final, on perd des secondes.

    As-tu consulté le forum conception? http://www.developpez.net/forums/d24...multi-couches/

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Salut,

    Merci pour le lien ! c'etait interessant
    Concernant les perfs, je dois t'avouer que pour le moment je n'ai pas encore installé d'outil pour le faire (je n'ai pas encore lu les tutos du site asp.net concernant le monitoring...)
    Néanmoins, sachant que je code sur un Imac via window 7 virtualisé avec parallels desktop, je ne suis pas sur que ma plateforme soit la meilleure pour avoir de bons tests ^^
    Je verrais ce que ca donne une fois monté sur le net, quand j'aurais un hebergeur

Discussions similaires

  1. Livre - Application en couche (GUI, BLL, DAL)
    Par Kiboumz dans le forum Architecture
    Réponses: 3
    Dernier message: 20/07/2009, 13h44
  2. Réponses: 15
    Dernier message: 25/05/2009, 17h31
  3. DAL+BLL que choisir?
    Par fixis dans le forum ASP.NET
    Réponses: 3
    Dernier message: 15/05/2009, 00h13
  4. [Linq to Sql] BLL ou DAL
    Par olifile dans le forum Accès aux données
    Réponses: 4
    Dernier message: 28/01/2009, 20h40
  5. [Architecture n-tier] Conception DAL & BLL
    Par lapanne dans le forum C#
    Réponses: 5
    Dernier message: 10/07/2007, 16h12

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