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 :

MEF - Silverlight - Jounce - Problème avec l'import (je pense)


Sujet :

Silverlight

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 12
    Points : 8
    Points
    8
    Par défaut MEF - Silverlight - Jounce - Problème avec l'import (je pense)
    Bonjour

    J’essaie de faire une application avec Silverlight 4, Jounce 1 et en utilisant MEF. Pour l’instant, des pseudo objets métiers me servent à tester l’architecture.


    J’ai une vue ServeurBleuView qui ne comprend que quelques zones de textes, avec un databind sur des propriétés dans ServeurViewModel.

    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
    namespace Console.View
    {
     
        [ExportAsView(Global.CONFIG_SERVEURBLEU_VIEW)]
        [ExportViewToRegion(Global.CONFIG_SERVEURBLEU_VIEW, Global.MAIN_REGION)]
        public partial class ServeurBleuView : UserControl
        {
            public ServeurBleuView()
            {
                InitializeComponent();
            }
     
     
            [Export]
            public ViewModelRoute Binding
            {
                get { return ViewModelRoute.Create(Global.CONFIG_SERVEURBLEU_VIEWMODEL, Global.CONFIG_SERVEURBLEU_VIEW); }
            }
        }
    }
    ServeurBleuViewModel importe un pseudo objet métier, du type ConnexionServeurBleu.

    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
    namespace Console.ViewModel
    {
        [ExportAsViewModel(Global.CONFIG_SERVEURBLEU_VIEWMODEL)]
        public class ServeurBleuViewModel : BaseViewModel
        {
           [Import]
           public ConnexionServeurBleu _maConnSb { get; set; }
     
          public ServeurBleuViewModel()
            {
                NomServeurBleu = _maConnSb.NomServeurBleu;
                UrlSb = _maConnSb.UrlServeurBleu;
            }
     
     
         public string NomServeurBleu { get; set; }
     
        }
    }
    La classe ConnexionServeurBleu s’exporte et importe le paramètre de son constructeur (injection de dépendance), de type interface IDonneesSb

    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
    namespace Console.ObjetsMetiersFake
    {
        [Export]
        public class ConnexionServeurBleu
        {
            private IDonneesSb _connecteurDonnees;
     
            [ImportingConstructor]
            public ConnexionServeurBleu(IDonneesSb connecteurDonnees)
            {
                _connecteurDonnees = connecteurDonnees;
                NomServeurBleu = connecteurDonnees.NomServeurBleu;
            }
     
     
            public string NomServeurBleu { get; set; }
        }
     }
    La classe DonnesSbXml implémente l’interface IDonneesSb et s’exporte.

    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
    namespace Console.ObjetsMetiersFake
     
    {
     
        [Export(typeof (IDonneesSb))]
        public class DonneesSbXml : IDonneesSb
        {
            public DonneesSbXml()
            {
                Initialise();
            }
     
            public string NomServeurBleu { get; set; }
     
            public void Initialise()
            {
                NomServeurBleu = "Serveur Bleu n° 1";
            }
        }
    }
    D’après ce que j’ai compris, Jounce se charge de la composition, et normalement, quand il charge ServeurBleuViewModel, il devrait charger ses dépendances (ServeurBleuViewModel--> ConnexionServeurBleu--> DonneesSbXml (en tant que IDonneesSb).


    Mais j’ai un message d’erreur quand j’essaie d’afficher la vue ServeurBleuView : http://screencast.com/t/ERuRBGAM4

    La solution est peut-être toute simple, mais je ne la trouve pas…

    Edit : c'est ici que cela cloche :

    [Import]
    public ConnexionServeurBleu _maConnSb { get; set; }
    l'import ne se fait, il devrait se faire sur :
    [Export]
    public class ConnexionServeurBleu


    Merci pour votre aide !

    Richard

  2. #2
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    J’ai trouvé une façon de faire marcher le bouzin.



    Voilà des extraits de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [ExportAsViewModel(Global.CONFIG_IMPRIMANTEBIDON_VIEWMODEL)]
        public class ImprimanteBidonViewModel : BaseViewModel
        {
            private readonly ILogger _logger;
     
            [ImportingConstructor]
            public ImprimanteBidonViewModel(IImprimanteBidon monImprimanteBidon)
            {
                NomServeurBleu = monImprimanteBidon.NomImprimante;
                UrlSb = monImprimanteBidon.UrlImprimante;
                Utilisateur = monImprimanteBidon.NomUtilisateur;
                SourceDonnees = monImprimanteBidon.ProvenanceDonnees;
                _logger = logger;
            }
    Par rapport au code precedent, j’ai supprimé [Import] je me sers maintenant de [ImportingConstructor]. J’ai fait la même chose pour un autre objet et cela marche, la composition se fait correctement.

    Mais je ne comprends pas pourquoi [Import] n’a pas marché.

    Et maintenant, j’ai un autre problème. J’ai fait une classe Logger, qui implémente l’interface ILog. Quand je l’utilise avec seulement une classe pour l’importer, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            [ImportingConstructor]
            public ImprimanteBidon(IDonneesImprBid connecteurDonnees, ILog logger)
            {
    cela marche, le logger est importé et je peux l’utiliser Mais si je veux aussi l’utiliser dans une autre classe, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            [ImportingConstructor]
            public ImprimanteBidonViewModel(IImprimanteBidon monImprimanteBidon, ILog logger)
            {
    J’ai ce message d’erreur : http://screencast.com/t/RGpxQ5QdslF

    Je ne comprends pas pourquoi. Je n’ai pas spécifié que l’objet ILog devait être non-partagé, j’ai juste écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        [Export(typeof(ILog))]
        public class FileLogger : ILog
        {
    Donc, l’instance de ILog devrait être partagée par toutes les partie qui l’importe, non ? Bien sûr, c’est le même logger que je veux utiliser dans plusieurs classes.


    Des idées ?

    Merci de votre aide

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    On m'a donné une solution dans le forum CodePlex :

    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
        [ExportAsViewModel(Global.CONFIG_IMPRIMANTEBIDON_VIEWMODEL)]
        public class ImprimanteBidonViewModel : BaseViewModel, IPartImportsSatisfiedNotification
        {
            private readonly ILog _logger;
     
            [Import]
            public IImprimanteBidon monImprimanteBidon { get; set; }
     
            [ImportingConstructor]
            //public ImprimanteBidonViewModel(IImprimanteBidon monImprimanteBidon, ILog logger)
            public ImprimanteBidonViewModel(ILog logger)
            {
     
                _logger = logger;
            }
     
            public void OnImportsSatisfied()
            {
                if (monImprimanteBidon == null) return;
                NomImprimanteBidon = monImprimanteBidon.NomImprimante;
                UrlSb = monImprimanteBidon.UrlImprimante;
                Utilisateur = monImprimanteBidon.NomUtilisateur;
                SourceDonnees = monImprimanteBidon.ProvenanceDonnees;
            }

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

Discussions similaires

  1. [JSTL] Probléme avec <c:import>
    Par winone dans le forum Taglibs
    Réponses: 3
    Dernier message: 06/01/2010, 10h21
  2. Problème avec l'importation d'un webservice
    Par lapec_and_cie dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 03/11/2009, 14h22
  3. Problème avec l'importation de projet Visual Studio 2005
    Par masterofsword0132 dans le forum Dreamshield
    Réponses: 5
    Dernier message: 26/08/2008, 17h00
  4. Problème avec Diaporama (important)
    Par jeanfly dans le forum Flash
    Réponses: 6
    Dernier message: 16/06/2007, 10h56
  5. Problème avec l'import DTS SQL Serveur 2005
    Par dlan dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/03/2006, 11h47

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