Implémentation de MVC avec Windows Forms

102

Où puis-je trouver un bon exemple sur la façon d'implémenter complètement le modèle MVC dans Windows Forms?

J'ai trouvé de nombreux tutoriels et exemples de code sur divers sites (par exemple, The Code Project et .NetHeaven), mais beaucoup sont plus représentatifs du modèle d'observateur que MVC. Puisque l'application que je souhaite développer est destinée à un projet scolaire, je suis réticent à utiliser des frameworks comme PureMVC ou MVC # .

kjv
la source

Réponses:

115

Je suis d'avis que les applications sont si différentes les unes des autres et que notre compréhension de la manière dont les applications doivent être rédigées est encore très limitée. Les applications Windows Forms sur lesquelles j'ai travaillé étaient si différentes les unes des autres. Certaines des différences de conception que j'ai constatées sont (y compris la plupart des combinaisons):

  • Parlez directement à la base de données (2 niveaux)
  • Utiliser un backend qui a été écrit pour l'application donnée (3 niveaux)
  • Utilisez un ensemble de services Web qui ont été écrits pour être utilisés par de nombreuses applications et qui ne peuvent pas être modifiés pour votre application. (Architecture orientée services)
  • Mises à jour effectuées par les opérations CRUD
  • Mises à jour effectuées avec le modèle de commande (envoi de commandes au serveur backend)
  • De nombreuses utilisations de la liaison de données / aucune utilisation de la liaison de données
  • La plupart des données sont «comme des tableaux» (par exemple les factures) qui fonctionnent bien dans les contrôles de grille standard / nécessitent des contrôles personnalisés pour la plupart des données de l'interface utilisateur.
  • Un développeur / équipes de 10 ou 20 développeurs (uniquement sur l'interface utilisateur)
  • Beaucoup de tests unitaires utilisant des simulations, etc. / pas de tests unitaires

Par conséquent, je ne pense pas qu'il soit possible de créer une implémentation de MVC (ou MVP) qui s'adapte toujours bien.

Les meilleurs articles que j'ai vus expliquant vraiment MVC et pourquoi un système MVC est construit comme il est, sont la série "Build Your Own CAB" de Jeremy D Miller . Après avoir travaillé, vous devriez être en mesure de mieux comprendre vos options. Les conseils de Microsoft Smart Client (CAB / Microsoft Composite Application Block) doivent également être pris en compte. C'est un peu complexe, mais cela peut bien fonctionner pour des applications bien adaptées.

La sélection d'une implémentation MVC / MVP pour un projet Winforms donne un aperçu qui vaut la peine d'être lu. Beaucoup de gens aiment PureMVC . Je ne l'ai jamais utilisé, mais je le regarderais la prochaine fois que j'aurais besoin d'un framework MVC.

« Presenter First » est une approche de développement logiciel qui combine les idées du modèle de conception Model View Presenter (MVP) et le développement piloté par les tests . Il vous permet de commencer par rédiger des tests dans la langue du client. Par exemple:

"Lorsque je clique sur le bouton" Enregistrer ", le fichier doit être enregistré et l'avertissement de fichier non enregistré doit disparaître."

Je n'ai aucune expérience de l'utilisation de «Presenter First», mais je vais essayer quand j'en aurai l'occasion, car cela semble très prometteur.

D'autres questions sur Stack Overflow que vous voudrez peut-être examiner sont ici et ici .

Si vous envisagez d'utiliser WPF à tout moment, jetez un œil au modèle Model-View ViewModel (MVVM) . Voici une très bonne vidéo que vous devriez regarder: Jason Dolinger sur Model-View-ViewModel .

Le modèle de conception MVVM (Model View View Model) pour Winforms offre une autre option qui peut faciliter la conversion en WPF si nécessaire. Magical.Trevor est encore un autre exemple MVVM pour Windows Forms qui inclut également la liaison automatique basée sur les noms de propriété.


Demandez-vous également pourquoi vous utilisez MVC.

  • Souhaitez-vous pouvoir tester le plus de code possible?
  • Essayez-vous d'autoriser autant de code que possible à être réutilisé?
  • Essayez-vous de rendre votre base de code facile à comprendre?
  • 101 autres raisons qui peuvent être valables pour un projet donné.

Une fois que vous êtes clair sur vos objectifs , il devient plus facile de choisir une mise en œuvre ou une autre.

Ian Ringrose
la source
@AgnelKurian, le CAB était un ensemble d'exemples de code de Microsoft sur la façon de créer des applications - c'est maintenant principalement de l'histoire.
Ian Ringrose
Haha! Oui, je me souviens de ces "blocs d'application" maintenant.
Agnel Kurian
45

MISE À JOUR: En plus de ma réponse précédente ci-dessous, je suggère de lire sur l' approche "Presenter First" (en particulier les articles PDF)

Je recommanderais MVP (modèle PassiveView en fait) au lieu de MVC. Vous n'avez pas vraiment besoin de frameworks spéciaux pour cela, c'est juste comment vous organisez votre code.

Une approche (que j'adopte généralement) consiste à diviser chaque formulaire de fenêtre en trois entités:

  1. Une classe de présentateur / contrôleur - c'est ce avec quoi vous commencez réellement lors du développement d'un formulaire. C'est là que la plupart / toute votre logique «métier» devrait résider.
  2. Une interface de vue (IView), qui contient les méthodes, les propriétés et les événements. Cette interface est tout ce que le présentateur sait de votre formulaire.
  3. À la fin, lorsque vous avez terminé d'implémenter le présentateur et la vue (y compris les tests unitaires), vous pouvez alors créer la classe de formulaire réelle et la faire implémenter l'interface IView. Ensuite, il suffit d'ajouter des contrôles appropriés au formulaire et de les câbler à l'interface.

Exemple de code (un pseudo-code simple, juste à titre d'illustration):

interface IView
{
    string Username { get; set; }
    string Password { get; set; }

    event EventHandler LogOnButtonClicked;

    void InformUserLogOnFailed();
    void MoveToMainScreen();
}

class Presenter
{
    public Presenter(IView view)
    {
        this.view = view;
        view.LogOnButtonClicked += new EventHandler(OnLogOnButton);
    }

    private void OnLogOnButton()
    {
        // we ask some service to verify the username/password
        bool isLogOnOk = logOnService.IsUserAndPasswordOk(view.Username, view.Password);
        if (isLogOnOk)
            view.MoveToMainScreen();
        else
        {
            view.Username = "";
            view.Password = "";
            view.InformUserLogOnFailed();
        }
    }

    private IView view;
}

class Form : IView
{
    public Form()
    {
        presenter = new Presenter(this);
    }

    public string Username
    {
        get { return TextBoxUsername.Text; }
        set { TextBoxUsername.Text = value; }
    }

    public string Password
    {
        get { return TextBoxPassword.Text; }
        set { TextBoxPassword.Text = value; }
    }

    public void InformUserLogOnFailed()
    {
        MessageBox.Show("Invalid username or password.");
    }

    public void MoveToMainScreen()
    {
        // code for opening another form...
    }

    private Presenter presenter;
}
Igor Brejc
la source
7
Il s'agit d'une implémentation de la variante MVP appelée PassiveView. Dans la vision passive, la vue ne doit pas choisir son présentateur. Pour un exemple similaire (mais avec une vue VRAIMENT passive), consultez cet exemple danieleteti.it/?p=221 (exemple en langage Delphi)
Daniele Teti
6

Avez-vous regardé PureMVC ? J'ai constaté que personne ne peut s'entendre sur ce à quoi ressemble vraiment MVC une fois qu'il a commencé à créer une implémentation spécifique.

Mise à jour: vous pouvez créer le vôtre en commençant par quelque chose de plus simple comme MobileMVC . Le code Compact Framework doit être compilé / exécuté correctement sous Windows. Puisqu'il s'agit d'un travail scolaire, je vous suggère de passer du temps à apprendre comment MVC fonctionne réellement.

Brian Lyttle
la source
J'ai une mission scolaire pour une application très simple pour gérer une librairie, et je suis assez réticent à utiliser un framework comme PureMVC. Je cherche quelque chose de plus simple.
kjv
3

Vous voudrez peut-être jeter un coup d'œil à l' exécution différentielle .

Le voici dans SourceForge

IMO, c'est une grande amélioration par rapport au MVC, même si c'est encore assez inhabituel.

Mike Dunlavey
la source
2

Un bon exemple de déploiement de votre propre implémentation de MVC à l'aide de Windows Forms peut être trouvé ici . Le code source est inclus.

En lisant, en étudiant et en écrivant du code pour cette affectation, vous constaterez qu'il y a beaucoup de désaccords sur la façon dont MVC doit être implémenté. Celui-ci est un cas simple qui reflète la séparation des préoccupations ainsi qu'un bon exemple de la «plomberie» nécessaire pour le raccorder.

Lorsque vous ne serez pas scolarisé, vous voudrez probablement vous rabattre sur un cadre comme les autres affiches l'ont recommandé.

Gary Ray
la source
2

Le bloc d'application d'interface composite Microsoft a commencé sa vie en tant qu'implémentation MVC (parmi d'autres modèles qu'il a implémentés). La version finale, cependant, a évolué vers une implémentation MVP, qui peut être considérée comme une sorte d'interprétation différente du concept MVC.

Si vous souhaitez vérifier le code d'une implémentation MVP très complète (et en quelque sorte complexe), vous pouvez trouver le MS-CAB comme l'un des composants de Microsoft Smart Client Software Factory. Il est livré avec le code source. Vous pouvez le trouver ici . Bonne chance!

Rui Craveiro
la source