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 MVC Discussion :

Durée de vie du context


Sujet :

ASP.NET MVC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Par défaut Durée de vie du context
    Rebonjour à tous ,

    J'ai de nouveau un problème. Pour commencer, voici mon code :

    Study Controller (Couche GUI) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ViewResult Index(string search)
            {
                var studies = StudyManager.SelectAll();
                return View(studies);
            }
    Study Manager (Couche BLL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static List<Study> SelectAll()
            {
                return StudyRep.Select();
            }
    Study Repository (Couche DAL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static ICollection<Study> Select()
            {
                using (PrismaDAL dal = new PrismaDAL())
                {
                    return dal.Studies.ToList();
                }
            }
    On voit que le Repository des Studies se crée un contexte pour charger la liste complète des studies.
    Le souci est que dans ma vue, j'aimerai accéder à un sous objet (une Phase) de chaque étude de la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @if (Model.Phase != null)
    {
        @Html.ActionLink(Model.Phase.Label, "Details/" + Model.Phase.Id.ToString(), "Codelist")
    }
    Au moment ou ma vue est exécutée, le contexte est déjà détruit et le lazy-loading est donc impossible.

    Ma question :
    Comment faire pour que mon sous-objet soit accessible ? Comment avoir un contexte qui "vit" assez longtemps pour permettre le lazy-loading dans la vue.

    Je me suis renseigné avant de poster évidemment, voici les solutions possibles :
    - Créer le context dans le controller, mais la division en couche n'est pas respectée.
    - Une autre option (qui est plus conseillée) est d'avoir un contexte par requete. En chipotant dans le global.asax, ca semble possible, mais je n'y arrive pas... Comment faire ?

    A+ et merci bcp

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Le Eager Loading est préférable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static ICollection<Study> Select()
    {
        using (PrismaDAL dal = new PrismaDAL())
        {
            return dal.Studies.Include("Phase").ToList();
         }
    }

  3. #3
    Membre éclairé Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Par défaut
    Salut,

    Merci pour ta réponse . Par contre ta solution implique que la couche GUI connaisse la couche DAL. La division en couche n'est donc pas respectée.

    Normalement, la couche GUI ne devrait appeler que la couche BLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GUI > BLL > DAL
       \   |   /
           BO
    Si tu as une autre idée, n'hésite pas .

    A+

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Euh ben non, c'était une méthode pour ta DAL que je t'ai proposé.

  5. #5
    Membre éclairé Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Par défaut
    Salut,

    Oups, j'avais pas vu le " Include("Phase") ".

    Le problème ici, c'est qu'on perd la simplicité d'utilisation du lazy-load. De plus, "Phase" était un exemple, ma structure est beaucoup plus complexe et un objet study est composé d'un grand nombre d'autres objets (dont phase).


    J'ai trouvé un moyen pour que le contexte ne soit détruit qu'à la fin de la requête :
    Global.asax (Couche GUI) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    protected void Application_EndRequest()
            {
                PrismaBLL.initializeContext();
            }
    PrismaBLL (couche BLL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static void initializeContext()
            {
                PrismaDAL.RemoveContext();
            }
    PrismaDAL (Couche DAL) :
    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
    public class PrismaDAL : DbContext
        {
            private static PrismaDAL _instance = null;
            public static PrismaDAL Instance
            { 
                get
                {
                    if (_instance == null)
                        _instance = new PrismaDAL();
                    return _instance;
                }
            }
     
            public static void RemoveContext()
            {
                if (_instance != null)
                    _instance.Dispose(true);
                _instance = null;
            }
     
            public DbSet<Codelist> Codelists { get; set; }
            public DbSet<Study> Studies { get; set; }
        }
    En faisant du contexte un singleton réinitialisé à la fin de chaque requête, ca passe parfois, mais dans certains cas, j'ai toujours mon problème :'(.

    Ouiiin ! Que faire ?


    Merci pour ton aide

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Dans l'idéal c'est effectivement ce qu'il faudrait faire: un contexte par requête. Par contre attention à ton cas: deux requêtes simultanées partageraient le contexte!
    Malhereusement, tu n'as pas trop le choix dans ton cas. Le lazy-loading c'est un truc qui peut être pratique mais qui peut s'avérer finalement très complexe à utiliser correctement et très dangereux sur les perfs (problème des requêtes n+1 par exemple).
    Ce que je conseille/ferais c'est de ne pas présenter les entités EF mais créer un objet de présentation qui ressemble à mon entité et le remplir avec plusieurs requêtes.
    D'une manière générale, le lazy-loading dans l'interface utilisateur n'est pas une bonne idée.

Discussions similaires

  1. Durée de vie d'une session
    Par dbass dans le forum Langage
    Réponses: 8
    Dernier message: 21/03/2006, 19h38
  2. [Cookies] durée de vie de l'objet
    Par ozzmax dans le forum Langage
    Réponses: 13
    Dernier message: 13/01/2006, 21h38
  3. [savoir] durée de vie d'un PC?
    Par afrikha dans le forum Composants
    Réponses: 20
    Dernier message: 24/10/2005, 13h28
  4. [AS2] durée de vie d'une classe (extends movieclip)
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 23/07/2005, 13h33
  5. prob de durée de vie de IDvdGraphBuilder
    Par Chaksss dans le forum DirectX
    Réponses: 11
    Dernier message: 30/12/2004, 16h09

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