102 votes

Mise en œuvre de MVC avec Windows Forms

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 CodeProject, .NetHeaven), mais beaucoup sont plus représentatifs du modèle observateur que du modèle MVC. Comme l'application que je veux développer est destinée à un projet scolaire, je suis réticent à l'idée d'utiliser des frameworks tels que PureMVC ou MVC# .

114voto

Ian Ringrose Points 19115

Je suis d'avis que les applications sont tellement différentes les unes des autres et que notre compréhension de la façon dont les applications devraient être écrites est encore très limitée. Les applications Windows Forms sur lesquelles j'ai travaillé dans le passé étaient tellement différentes les unes des autres, certaines des différences de conception que j'ai vues sont (y compris la plupart des combinaisons) :

  • Communiquer directement avec 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)
  • Les mises à jour sont effectuées par CRUD opérations
  • Les mises à jour sont effectuées avec le schéma de commande (envoi de commandes au serveur dorsal)
  • Beaucoup d'utilisations de liaison de données / pas d'utilisation de la liaison de données
  • La plupart des données sont de type "tableau" (par exemple, les factures) qui fonctionnent bien dans les contrôles de grille standard / il faut des contrôles personnalisés pour la plupart des données de l'interface utilisateur.
  • 1 développeur / équipes de 10 ou 20 développeurs (uniquement sur l'interface utilisateur)
  • Beaucoup de tests unitaires utilisant des mocks etc / pas de tests unitaires

C'est pourquoi je ne pense pas qu'il soit possible de créer une seule implémentation de MVC (ou MVP) qui s'adapte toujours bien.

Les meilleurs postes que j'ai vus vraiment expliquant MVC et pourquoi un système MVC est construit comme il l'est, est le Série "Construisez votre propre CAB" par Jeremy D Miller . Après l'avoir examiné, vous devriez être en mesure de mieux comprendre vos options. Smart Client Guidance de Microsoft (CAB / Microsoft Composite Application Block) Il est un peu complexe, mais il peut être utile pour les applications qui s'y prêtent bien.

Sélection d'un Mise en œuvre de MVC/MVP pour un projet Winforms donnent une vue d'ensemble qui vaut la peine d'être lue. Beaucoup de gens aiment PureMVC Je ne l'ai jamais utilisé, mais je l'examinerai la prochaine fois que j'aurai besoin d'un framework MVC.

" Présentateur d'abord "est une approche de développement logiciel qui combine les idées du modèle de conception Model View Presenter (MVP) et du développement piloté par les tests. Elle vous permet de commencer par écrire des tests dans le langage du client, par ex.

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

Je n'ai aucune expérience de l'utilisation de "Presenter First", mais je l'essaierai dès que j'en aurai l'occasion, car il semble très prometteur.

Autres questions de stackoverflow que vous pourriez consulter ici et ici .

Si vous envisagez d'utiliser WPF à tout moment, jetez un coup d'œil à la Modèle-Vue-Vue-Modèle (MVVM) modèle. Voici une très bonne vidéo à laquelle vous devriez jeter un coup d'œil : Jason Dolinger sur Modèle-Vue-Vue-Modèle .

MVVM (Model View View Model) Design Pattern pour Winforms donner une autre option qui pourrait rendre plus facile la conversion vers WPF si nécessaire. Magical.Trevor est encore un autre exemple de MVVM pour WinForms qui inclut également la liaison automatique basée sur les noms de propriétés.


Demandez-vous aussi pourquoi vous utilisez MVC.

  • Souhaitez-vous être en mesure de tester unitairement le plus de code possible ?
  • Essayez-vous de permettre la réutilisation d'un maximum de code ?
  • 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 au clair sur votre objectifs il devient plus facile de choisir une implémentation ou une autre.

45voto

Igor Brejc Points 9752

MISE À JOUR : En plus de ma réponse précédente ci-dessous, je vous suggère de lire l'article sur les "Approche "Présentateur d'abord (notamment les articles en PDF)

Je recommanderais le MVP (PassiveView pattern en fait) plutôt que le MVC. Vous n'avez pas vraiment besoin de frameworks spéciaux pour cela, c'est juste la façon dont vous organisez votre code.

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

  1. Une classe de présentateur/contrôleur - c'est par elle que vous commencez réellement lorsque vous développez un formulaire. C'est là que doit résider la majeure partie de votre logique "métier".
  2. Une interface de vue (IView), qui contient les méthodes, les propriétés et les événements. Cette interface est tous que le présentateur connaisse votre formulaire.
  3. À la fin, lorsque vous aurez fini d'implémenter le présentateur et la vue (y compris les tests unitaires), vous pourrez alors créer la classe de formulaire proprement dite et lui faire implémenter l'interface IView. Il suffit alors d'ajouter les contrôles appropriés au formulaire et de les relier à l'interface.

Exemple de code (un pseudo-code simple, juste pour l'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;
}

6voto

Brian Lyttle Points 9344

Avez-vous regardé PureMVC ? J'ai constaté que personne ne peut se mettre d'accord sur ce à quoi ressemble réellement MVC une fois qu'on commence à construire une implémentation spécifique.

Mise à jour : Vous pouvez construire votre propre système en commençant par quelque chose de plus simple, tel que MobileMVC . Compact Framework devrait compiler et fonctionner correctement sous Windows. Étant donné qu'il s'agit d'un travail scolaire, je vous suggère de passer un peu de temps à apprendre comment fonctionne MVC.

3voto

Mike Dunlavey Points 25419

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

Le voici en SourceForge

IMO, c'est une grande amélioration par rapport à MVC, bien que ce soit encore assez inhabituel.

2voto

Gary.Ray Points 4042

Vous trouverez un bon exemple d'implémentation de MVC à l'aide de Windows Forms. ici . Le code source est inclus.

Au fur et à mesure que vous lirez, étudierez et écrirez du code pour cette mission, vous constaterez qu'il existe de nombreux désaccords sur la manière dont MVC doit être mis en œuvre. 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 mettre en œuvre.

Une fois que vous aurez quitté l'école, vous voudrez probablement vous appuyer sur un cadre tel que celui recommandé par les autres affiches.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X