web-dev-qa-db-fra.com

MVC C # - Implémentation la plus simple possible

Mon premier essai de MVC. J'essaie de mettre en œuvre un exemple simple . Inspiration de ici . Ai-je (encore!) Ce schéma?

  1. Voir: "Hé, contrôleur, l'utilisateur vient de me dire qu'il veut la première personne"

  2. Contrôleur: "Hmm, après avoir vérifié ses informations d'identification, il est autorisé à le faire ... Hé, mannequin, je veux que tu me donnes la première personne"

  3. Modèle: "La première personne ... l'a compris. Retour à vous, contrôleur."

  4. Contrôleur: "Ici, je vais collecter le nouvel ensemble de données. Retour à vous, voir."

  5. Voir: "Cool, je vais montrer la première personne à l'utilisateur maintenant."

Vue:

namespace WinFormMVC
{
    public partial class Form1 : Form
    {
        controller cont = new controller();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = cont.checkPermissionsAndGetFirstPerson();
        }
    }
}

Manette:

public class controller
    {
        public string checkPermissionsAndGetFirstPerson()
        {
            string returnValue = "";
            if (checkPermissions())
            {
                model m = new model();
                returnValue =  m.getFirstPerson();
            }

            return returnValue;

        }

        public bool checkPermissions()
        {
            return true;
        }
    }

Modèle:

public class model
    {
        public string getFirstPerson()
        {
            return "Bill Smith";
        }
    }
26
Dave Mateer

Hmm ... Je ne sais pas si j'appellerais cela MVC ... Comme avec ASP.NET WebForm, ce formulaire ressemble plus à un modèle MVP.

Selon ma compréhension, dans MVC, le contrôleur est celui responsable de la gestion de toutes les ressources et du flux du code. Dans votre exemple, vous créez d'abord un formulaire Windows (la vue), puis vous y attachez un contrôleur qui est plus une sorte de MVP.

Dans un modèle MVC classique, le modèle, une fois instancié, sera lié à la vue et lorsque le modèle change, la vue sera notifiée (éventuellement via le modèle Observer/PubSub).

Un clic sur le bouton, etc. depuis la vue sera acheminé vers le contrôleur qui coordonnera ce genre de choses.

voir: this .

6
Jimmy Chandra

Je décrirais MVC plus comme ceci:

  1. Demande (routage d'URL MVC, certains événements passés depuis l'interface utilisateur précédente, etc.)

  2. Contrôleur - vérifier les informations d'identification, obtenir des données, renvoyer le modèle

  3. Modèle - représente les données renvoyées par le contrôleur

  4. Vue - restitue le modèle renvoyé par le contrôleur. Selon le modèle, il peut afficher l'interface utilisateur pour initialiser de nouvelles actions de contrôleur. Peut également renvoyer le modèle à la prochaine action du contrôleur.

Je pense que cela peut être un peu confus car dans de nombreuses implémentations de modèles (comme Linq), ils fournissent la définition et l'accès aux données, mais c'est toujours le contrôleur qui sait par où commencer (même si c'est le modèle qui sait comment enregistrer ses propres modifications) .

Donc, votre code devrait ressembler à:

//Controller:
public class PersonController
{
    public PersonAction Detail(int personId)
    {
        Person returnValue;
        //get person from DB and populate returnValue
        return new PersonAction( returnValue );
    }
}

//Model:
public class Person
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

//View:
public partial class PersonDetailView : MVCForm<Person>
{
    public Form1( Person model ):base(model) {
        textBox1.Text = model.FirstName + " " + model.LastName;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = model.FirstName + " " + model.LastName;
    }
}

Ce qui manque à cet exemple, c'est le cadre qui rend tout cela possible - il y a deux parties importantes à cela:

  1. Quelque chose qui prend/analyse les paramètres et en fonction de cela appelle la méthode d'action d'un contrôleur. Par exemple, dans Asp.net MVC, ce sont les gestionnaires de routage - l'appel ci-dessus serait l'URL de la demande: ~/Person/Detail/personId

  2. Quelque chose qui prend le résultat de l'action (PersonAction dans l'exemple ci-dessus) et trouve la vue correcte à afficher. Dans cet exemple, il ouvrirait un formulaire PersonDetailView et lui passerait le modèle Person.

Il existe de nombreux exemples de frameworks pour une implémentation MVC pour WinForms - l'un d'eux peut être un bon point de départ.

6
Keith

Je pense qu'il y a quelques corrections à apporter à votre récit. À proprement parler, la vue ne contacte pas le contrôleur, l'utilisateur contacte directement le contrôleur. Dans une application Web, cela ressemble à ceci.

  1. Utilisateur: Hey application web, puis-je avoir la ressource sur/people/1

  2. Moteur de routage: cela signifie que vous êtes le contrôleur de la personne. obtenir le premier utilisateur.

  3. Contrôleur utilisateur: modèle, j'ai besoin de vous pour obtenir un enregistrement utilisateur pour l'utilisateur authentifié et un enregistrement personne pour la première personne.

  4. Contrôleur utilisateur: à droite. Je sais que l'utilisateur authentifié est un administrateur et qu'une personne existe. Rendez donc la vue Admin pour la personne à l'utilisateur.

  5. Moteur de rendu: créez le code HTML à partir de la vue (modèle) et de l'objet personne (données)

C'est difficile à faire dans les formulaires Web. Je suppose que la meilleure façon est d'avoir une page pour chaque contrôleur, et de faire en sorte que cette page choisisse et affiche dynamiquement un contrôle utilisateur. Un pour chaque vue. Il est important dans MVC que la vue soit stupide. Toutes les demandes sont traitées directement par les contrôleurs, qui sélectionnent ensuite la vue à utiliser.

1
Jack Ryan

Pour adopter le modèle MVC, vous souhaitez implémenter les éléments suivants:

  • La vue se connecte au modèle et écoute les modifications.
  • Le contrôleur se connecte à la vue et gère les événements spécifiques, par exemple les pressions sur les boutons, etc.
  • Le modèle traite les demandes faites par le contrôleur et notifie la vue.

Je suis d'accord avec Jimmy, vous voudriez intégrer quelque chose comme le modèle Observer à ce type de système afin qu'il soit possible pour le modèle d'informer la vue lorsqu'elle change afin que la vue puisse ensuite se mettre à jour en conséquence.

La différence avec MVP est qu'elle introduit une classe Presenter qui surveille le modèle au nom de la vue, en d'autres termes, la vue ne connaît pas le modèle, elle ne connaît que son présentateur. Le présentateur répond aux modifications du modèle et met à jour la vue en conséquence.

1
James

Votre méthode checkPermissionsAndGetFirstPerson en fait probablement trop. L'autorisation et la récupération des données devraient probablement être des opérations distinctes.

De plus, si votre Form1 la classe est votre point de vue, elle ne devrait probablement pas construire le contrôleur. Cela semble à l'envers.

La plupart des informations que vous trouverez sur MVC dans .NET seront destinées aux applications Web ASP.NET MVC. Vous voudrez peut-être consulter le projet WinFormsMVC sur CodePlex pour voir comment quelqu'un d'autre a résolu ce problème.

http://winformsmvc.codeplex.com/

Voici une autre implémentation WinForms MVC sur CodePlex. On dirait qu'il a un peu plus de documentation.

http://koosserymvcwin.codeplex.com/

0
CoderDennis

Vous pourriez trouver ce tutoriel très utile: http://nerddinnerbook.s3.amazonaws.com/Intro.htm . Écrit par Scott Guthrie, il explique très bien le flux de travail MVC. La partie 4 devrait avoir les bases que vous recherchez.

0
synhershko