web-dev-qa-db-fra.com

Comment implémenteriez-vous MVC dans une application Windows Forms?

Je ne développe pas trop d'applications de bureau/Windows Forms, mais il m'est venu à l'esprit qu'il pourrait être avantageux d'utiliser le modèle MVC (Model View Controller) pour le développement Windows Forms .NET.

Quelqu'un a-t-il implémenté MVC dans Windows Forms? Si oui, avez-vous des conseils sur la conception?

64
Chris Pietschmann

Ce que j'ai fait dans le passé, c'est utiliser quelque chose de similaire, Model-View-Presenter .

[REMARQUE: Cet article était auparavant disponible sur le Web. Pour le voir maintenant, vous devrez télécharger le CHM, puis afficher les propriétés du fichier et cliquer sur Débloquer. Ensuite, vous pouvez ouvrir le CHM et trouver l'article. Merci mille fois, Microsoft! soupir]

Le formulaire est la vue, et j'ai une interface IView pour cela. Tout le traitement a lieu dans le présentateur, qui n'est qu'une classe. Le formulaire crée un nouveau présentateur et se transforme en IView du présentateur. De cette façon, pour les tests, vous pouvez passer une fausse IView à la place, puis lui envoyer des commandes à partir du présentateur et détecter les résultats.

Si je devais utiliser un contrôleur de vue de modèle à part entière, je suppose que je le ferais de cette façon:

  • Le formulaire est la vue . Il envoie des commandes au modèle, déclenche des événements auxquels le contrôleur peut s'abonner et s'abonne aux événements du modèle.
  • Le contrôleur est une classe qui souscrit aux événements de la vue et envoie des commandes à la vue et au modèle.
  • Le modèle déclenche des événements auxquels la vue est abonnée.

Cela correspondrait à le schéma MVC classique . Le plus gros inconvénient est qu'avec les événements, il peut être difficile de dire qui est abonné à quoi. Le modèle MVP utilise des méthodes au lieu d'événements (du moins la façon dont je l'ai implémenté). Lorsque le formulaire/vue déclenche un événement (par exemple someButton.Click), le formulaire appelle simplement une méthode sur le présentateur pour exécuter la logique à cet effet. La vue et le modèle n'ont aucune connexion directe; ils doivent tous les deux passer par le présentateur.

40
Ryan Lundy

Eh bien, en fait, Windows Forms implémente une version "libre" de MVC, tout comme certains films implémentent une interprétation merdique "libre" de certains livres classiques (Romeo & Juliet me viennent à l'esprit).

Je ne dis pas que l'implémentation de Windows Forms est mauvaise, c'est juste ... différent.

Si vous utilisez Windows Forms et les techniques OOP appropriées, et peut-être un ORM comme EntitySpaces pour votre accès à la base de données, vous pouvez dire que:

  1. L'infrastructure ORM/OOP est le modèle
  2. Les formulaires sont les vues
  3. Les gestionnaires d'événements sont le contrôleur

Bien que la vue et le contrôleur soient représentés par le même objet, il est plus difficile de séparer le code de la représentation (il n'y a pas de moyen facile de brancher une "vue GTK +" dans une classe dérivée de Microsoft.Windows.Forms.Form).

Ce que vous pouvez faire si vous êtes assez prudent. Conservez votre code de formulaire complètement séparé de votre code de contrôleur/modèle en écrivant uniquement les éléments liés à l'interface graphique dans les gestionnaires d'événements et toutes les autres logiques métier dans une classe distincte. Dans ce cas, si vous avez toujours voulu utiliser GTK + pour écrire une autre couche View, il vous suffirait de réécrire le code GUI.

19
dguaraglia

Windows Forms n'est pas conçu dès le départ pour utiliser MVC. Vous avez deux options.

Tout d'abord, vous pouvez lancer votre propre implémentation de MVC.

Deuxièmement, vous pouvez utiliser un framework MVC conçu pour Windows Forms.

Le premier est simple à faire, mais plus vous avancez, plus c'est complexe. Je suggère de rechercher un bon framework MVC préexistant et bien testé, conçu pour fonctionner avec Windows Forms. Je crois ce billet de blog est un bon point de départ.

Pour tous ceux qui débutent, je suggère de sauter les formulaires Windows et de développer contre WPF, si vous en avez la possibilité. C'est un bien meilleur cadre pour créer l'interface utilisateur. Il existe de nombreux frameworks MVC en cours de développement pour WPF, y compris celui-ci et celui-ci .

17
Will

Selon Microsoft, le bloc d'application UIP mentionné par @jasonbunting est "archivé". Regardez plutôt Smart Client Application Block ou encore plus récent Smart Client Software Factory , qui prend en charge WinForms et WPF SmartParts.

4
aridlehoover

Vérifiez dans le bloc d'application Processus d'interface utilisateur (UIP) . Je n'en sais pas grand-chose, mais je l'ai regardé il y a quelques années. Il peut y avoir des versions plus récentes, vérifiez autour.

"Le bloc d'application UIP est basé sur le modèle de modèle-vue-contrôleur (MVC)."

2
Jason Bunting

Jetez un coup d'œil au bloc d'application Smart Client MS Patterns and Practices qui contient des conseils et des classes qui vous guident à travers l'implémentation d'un modèle de présentation de modèle dans les formulaires Windows - jetez un œil à l'application de référence incluse.

Pour WPF, cela est remplacé par le projet prism

L'approche des usines de logiciels est un excellent moyen d'apprendre les meilleures pratiques

1
Richard