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 :

ADO.NET - Silverlight 4 - MVVM


Sujet :

Silverlight

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2009
    Messages : 38
    Par défaut ADO.NET - Silverlight 4 - MVVM
    Bonsoir à tous,

    Je fais encore appel à vous car là je cale....
    Voilà 1 mois que je suis rentré dans le monde .Net, plus particulièrement dans Silverlight... et j'avoue que je suis un peu perdu.


    Je dois concevoir une grosse application Silverlight qui doit se connecter à une base de données SQL SERVER 2008. Je travaille actuellement avec Visual Studio 2010. Voilà pour le contexte.

    Problème:
    J'ai actuellement une base de donnée avec trois tables (on simplifie le problème à son maximum, histoire d'avoir une solution...)

    Une table Projet qui contient:
    int ID;
    string nomProjet;

    Une table Technologie:
    int ID;
    string Libelle;

    Une table Projet_has_Technologies:
    int ID_Projet;
    int ID_Technology;


    Voilà pour ce qui est de la BDD. J'arrive à faire mon .edmx (Elément ADO.NET Entity Data Model) sans problème, avec ma liaison n-n entre Technologie et Projet (table Projet_has_Technologies)


    Coté Silverlight, j'aimerais avoir une pop-up qui s'ouvre lors du clic sur un bouton "Ajouter Projet" (jusque là, pas de soucis, la childWindow fonctionne) mais qui mette dans une comboBox la liste des technologies de ma base de données.
    Là je coince... car j'aimerais faire ça proprement. J'ai fait une tentative qui fonctionne, mais qui est vraiment effrayante que voici:

    Un WebService qui contient la méthode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [WebMethod]
            public List<string> GetTechnologie()
            {
                List<string> LT = new List<string>();
     
                foreach (Technology t in (from _t in ssr.Technology select _t))
                {
                    LT.Add(t.Libelle);
                }
                return LT;
            }
    Mon WebService est Référencé dans Silverlight et j'appelle la méthode de cette manière (Reactive code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    IObservable<IEvent<GetTechnologieCompletedEventArgs>> observable = Observable.FromEvent<GetTechnologieCompletedEventArgs>(client, "GetTechnologieCompleted").Take(1);
                            IDisposable d = null;
                            d = observable.Subscribe(u =>
                            {
                                AR.technologiesACB.ItemsSource = u.EventArgs.Result;
                                d.Dispose();
                            });
                            client.GetTechnologieAsync();

    Donc mes questions sont les suivantes:
    Y a-t-il un moyen plus propre de faire cela ?
    Prenons le cas où je veuille éditer un projet, comment récupérer les technologies du projet sans faire une cascade d'appel Asynchrone comme celui ci-dessus ? Par exemple récupérer un objet qui contient toutes les informations du projet y compris ses technologies.

    Le code doit-il être coté client ou serveur?

    J'avoue avoir du mal à architecturer proprement mon application, notamment pour ce qui est de la récupération de données... dois-je refaire des Entity coté client ou utiliser le mapping fait par l'ajout du WebService ?


    Je viens du monde Flex et Java, et je dois avouer que la logique .net n'est pas facile en première approche
    J'ai eu l'habitude d'Hibernate qui faisait cela très bien sans avoir à se préoccupé des classes métiers...
    Tout comme pour la logique asynchrone, l'abonnement Flex est plus simple avec les Dispatch et addListener...

    Si je n'ai pas été assez clair, je pourrais vous éclaircir les points obscurs !

    Merci d'avance !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Pour ta méthode GetTechnologie, j'aurais fais comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [WebMethod]
    public List<Technology> GetTechnologie()
    {
         return ssr.Technology.ToList();
    }
    Comme ça, tu renvois directement une liste contenant des objets Technology.
    Tu pourras ainsi peupler ta ComboBox en affichant le nom de la Techno et en ayant son ID.

    Pour avoir toutes les infos d'un projet (y compris ses technos), il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [WebMethod]
    public Projet GetProjet(int IDProjet)
    {
         return ssr.Projet.Include("Technology").Where(pro => pro.ID == IDProjet).FirstOrDefault();
    }
    Le Include permet de préciser qu'on souhaite récup toutes les techno associer au projet.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Salut,

    D'après ce que je vois tu utilises des webservices asmx. Je ne peux que t'encourager à utiliser du WCF.

    Sinon concernant l'architecture, tout ce qui récupère des objets depuis la base doit être côté serveur. Ton serveur expose ensuite des services web (WCF de préférence). Lorsque tu ajouteras une référence à un service web dans ton Silverlight, Visual Studio fera une copie des classes entités de sortes à ce que tu n'ai pas à les recréer à la main.
    Ton client fait ensuite appel à tes méthodes de Webservices pour faire des Get, Update, Insert et Delete.

    En ce qui concerne l'asynchrone je vois que tu as utilisé Rx ce qui est à mon avis une bonne chose. Si jamais tu persiste dans cette voie je t'invite à lire cet article pour te simplifier tes appels asynchrones avec Rx (il est un peu long).
    http://blog.john-thiriet.com/2010/09...ve-extensions/

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2009
    Messages : 38
    Par défaut
    Tout d'abord merci pour vos réponses et désolé de mon temps de réponse, petits problèmes internet

    Donc je suis reparti sur une architecture LinqToSql qui me permet de bosser comme Hathortos ! Vraiment magique ce système de mapping de Table par des Classes !

    Pour les appels aux Webservices je suis effectivement passé par un service WCF compatible silverlight qui fait référence à mon projet DataAccesLayer (DBO) et n'est plus donc qu'une simple passerelle entre mon client et mon modèle de base de données ! (ouf une archi à peu près propre! il était temps )

    Le CRUD est donc mis en place pour mes classes et fonctionne correctement et plus simplement.
    Je récupère en effet mon objet Projet qui contient directement toutes mes techno sans passer par une autre requête ou autre artéfact.


    Pour ce qui est des asynchrone, je reste en Rx mais garde sous le coude des appel normaux pour les Rx non obligatoire, en attentant la solution ouverte par Silverlight 5 =) (oui oui j'ai vu la ligne magique lol)

    Aussi je vais intégrer le système de Message .Net qui me permet de mettre en place un système à agent qui se révèle plutôt efficace pour les MAJ IHM.


    J'aurais une dernière petite question toutefois (Mode Newbie), comment je fais pour mapper directement ma liste de technologies dans une Combobox ?

    Car bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    List<Technologie> l = getListTechnologie();
    comboBox.ItemsSource = l;
    ca marche pas des masse ^^

    Merci à vous de m'avoir éclairer !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Salut,

    Il faut savoir que LinqToSql est abandonné et qu'il vaux mieux utiliser Entity Framework. Le concept est le même que LinqToSql et c'est ce framework que Microsoft développe maintenant.

    En ce qui concerne ta combobox tu as effectivement affecté ta collection de technologie à ta combobox mais tu ne lui a pas dis quelle propriété afficher.

    Dans ton Xaml fait un truc du genre :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <ComboBox x:Name="comboBox" DisplayMemberPath="NomDeLaProprieteAAfficherDeLaClasseTechnologie" />

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2009
    Messages : 38
    Par défaut
    Merci pour l'info concernant Linq, je n'étais pas au courant... Au vu de mon architecture, il semblerait que je n'ai qu'à changé le .dbml en fichier edmx mappé sur ma BDD (à confirmer mais si ce n'est que cela c'est pas trop méchant ^^)

    Merci pour le DisplayMemberPath c'était effectivement mon erreur

    Je repasserais sous un modèle Entity ce soir et demain et je vous tiens au courant. Je laisse le topic ouvert si vous avez d'autres suggestions concernant l'architecture jusqu'à ce que je soit passé sous Entity Framework!

    Je posterais l'architecture complète une fois finie pour ceux qui sont dans la même interrogation !


    Merci beaucoup pour votre réactivité !

  7. #7
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    Pour répondre à ton dernier post, pour l'architecture, tu peux faire un application Silverlight avec RIA. Cela entraîne quelques contraintes mais c'est assez efficace de développer dans ce mode si on est pas allergique à la génération de code ce qui est assez bien géré aujourd'hui dans VS2010.

Discussions similaires

  1. Requete Silverlight + ADO.NET ENTITIES
    Par LordofKalbut dans le forum Silverlight
    Réponses: 4
    Dernier message: 24/03/2011, 15h47
  2. Réponses: 5
    Dernier message: 01/03/2011, 13h34
  3. silverlight ado. net entity
    Par cbleas dans le forum Silverlight
    Réponses: 3
    Dernier message: 20/05/2010, 07h38
  4. Silverlight 3 avec ado.net
    Par Dragna_x dans le forum Développement Web avec .NET
    Réponses: 2
    Dernier message: 23/03/2010, 15h07
  5. ADO.NET Entity Framework, Astoria, Silverlight -> .NET 3.5 ?
    Par rad_hass dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 08/07/2008, 16h01

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