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

Silverlight Discussion :

Injection de dépendance avec MVVM => Boucle infinie


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut Injection de dépendance avec MVVM => Boucle infinie
    Bonjour,

    Je travail sur une application Silverlight utilisant le pattern MVVM et l'injection de dépendance.

    Je me heurte a un cas un peu particulier où mes injections de dépendance partent en boucle infinie.

    Voici la structure : (légende : <= signifie injecté)

    ViewA <= ViewModelA <= ViewB <= ViewModelB <= ViewModelA

    Explications :
    - le ViewModelA est injecté dans la ViewA (normal)
    - le ViewModelB est injecté dans la vueB (normal aussi)
    - la ViewB est injecté dans le ViewModelA car celui-ci l'expose comme propriété (peut-être bizarre)
    - le ViewModelA est injecté dans le ViewModelB car une commande exposée par celui-ci agit sur le ViewModelA

    J'ai bien conscience que le problème en lui même est lié aux différentes associations et au fait que tout est injecté, mais peut-être y a-t-il une subtilité qui m'aurait échappé et que finalement il y a un moyen de régler tout ça.

    La première chose qui m'est venue à l'idée a été d'essayé de faire passer l'une des associations via un constructeur mais les constructeurs des Views ne prennent pas de paramètre...

    Merci pour votre aide

  2. #2
    Membre chevronné Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Par défaut
    Salut,
    essaie de simplifier ton architecture, le fait que "viewmodelA" apparaisse deux fois dans ton petit schéma n'est pas normal.
    Si c'est trop tard, ou si c'est justifié par autre chose, essaie de passer par une 3eme dll (par ex. qui expose des interfaces implémentées par les viewmodel), pour casser les dépendances. Tu vas du coup perdre en simplicité, ça dépend de ton projet.

  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 : 43
    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
    Bizarre ton histoire
    L'injection de dépendance c'est bien, mais faut pas en abuser... et là à mon avis tu en abuses largement !

    - la ViewB est injecté dans le ViewModelA car celui-ci l'expose comme propriété (peut-être bizarre)
    oui, très bizarre... un ViewModel n'a aucune raison d'entendre parler de la vue, ça ne le concerne pas ! La vue utilise le ViewModel, mais le ViewModel est totalement indépendant de la vue !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut
    Effectivement, je me doutais que ce n'était pas la bonne solution, mais je n'ai pas trouvé d'autre moyen, je m'explique :

    En fait, tous mes ViewModel sont injectés dans leur vue respective, le soucis, c'est que si dans le XAML de ma ViewA, j'insère un ViewB, alors le constructeurde ViewB est appelé par la méthode InitializeComponent() de ViewA mais l'injection du ViewModelB dans ViewB ne se fait pas...

    La solution que j'ai trouvée est en fait de ne pas mettre directement ViewB dans le XAML de ViewA mais plutôt un <ContentControl> dont je bind le Content avec la ViewB injectée dans ViewModelA et exposée comme propriété.

    Disons, que cette solution ne me plait pas vraiment mais que j'aurais certainement à l'utiliser à un moment donné car j'ai une ComboBox qui permet de choisir entre plusieurs ViewB, ViewB devra donc bel et bien être exposé comme propriété par ViewModelA, non ?

    Toutefois, j'aimerais pouvoir éviter l'injection des View filles dans le ViewModel père autant que possible, donc si vous avez également une solution pour permettre l'injection de tous les ViewModels dans les Views en cascade, je suis preneur aussi


    Merci

  5. #5
    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 : 43
    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
    Si la ViewA contient une ViewB, je suppose que le ViewModelA (appelons le A) contient un ViewModelB (B) ? Dans ce cas le plus simple c'est de mettre un ContentControl dans la ViewA, dont le contenu est bindé sur la propriété A.B, et avec le ContentTemplate qui va bien :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ContentControl Content="{Binding B}">
        <ContentControl.ContentTemplate>
            <DataTemplate>
                <v:ViewB />
            </DataTemplate>
        </ContentControl.ContentTemplate>
    </ContentControl>

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut
    Jusqu'a présent, je n'incluait pas les ViewModels fils dans le ViewModel père, c'est effectivement une bonne solution pour régler le problème de la boucle infinie et ça semble plus logique que d'inclure une View. Ca m'oblige seulement a créer mes instances de ViewModels dans App.xaml.cs et de les enregistrer comme unique instance avec Unity.

    J'espère ne pas abuser de votre temps en soumettant un autre problème :

    Je veux maintenant pouvoir choisir le Content du ContentControl, qu'il puisse être soit une ViewB, soit une ViewC suivant la valeur sélectionnée par la Combobox. Je pense que je peux faire hérité ViewModelB et ViewModelC d'une même classe (ViewModelBC par exemple), mais quid de la View ? Peut-être puis-je créer une propriété DataTemplate dans mon ViewModel puis binder le ContentTemplate vers celle-ci.

    Il existe peut-être d'autres solutions préférables à celle-ci ?

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 09/09/2011, 19h15

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