Est-ce que je transposent correctement le modèle interface utilisateur MVP / Présentation modèle?

StackOverflow https://stackoverflow.com/questions/3435834

Question

Je retravaillant une application Winforms et souhaite utiliser une variante de la Présentation modèle Modèle pour l'interface utilisateur. Quelqu'un pourrait-il me dire des explications qui suivent si je le fais correctement?


J'ai décidé de créer des dépendances comme suit:

   Model <---- Presentation Model <---- View

C'est:

  • Le modèle est au courant de rien, sauf lui-même.

  • Le modèle de présentation a une référence au modèle (mais pas vice versa).

  • Le point de vue a une référence au modèle de présentation (mais pas vice versa).

J'utilise des données WinForms sont tenus de maintenir la vue et le modèle de présentation synchronisée.

Maintenant, tout cela fonctionne comme un charme, sauf quand je dois traiter par exemple un clic sur le bouton « Fermer » d'un formulaire. Étant donné que le modèle de présentation n'a pas de référence à la vue, il ne peut pas souscrire à des événements publiés par la vue. Ainsi, je suis venu avec la béquille suivante:

Presentation Model                   View
+--+                                 +--+
|  |                                 |  |
|  |                                 | <--------X closeButton.Click event fires
|  |                                 |  |
|  |                         +--------X |
|  |   CloseRequested = true |       |  | 
|  |                         +--------> |
|  |                                 |  |
|  | CloseRequested   CloseRequested |  |
| <-----------------------------------< |
|  |                                 |  |
| X--------+                         |  |
|  |       | IsClosed = true         |  |
| <--------+                         |  |
|  |                                 |  |
|  | IsClosed              MustClose |  |
| >-----------------------------------> |
|  |                                 |  |
|  |                                 | X--------> view.Close()
|  |                                 |  |
+--+                                 +--+

C'est:

  • L'utilisateur clique sur le bouton "Fermer".

  • L'événement Click du bouton est capturé dans la vue, qui réagit en définissant la propriété CloseRequested.

  • transferts de données liant cette valeur à une propriété correspondante dans le modèle de présentation.

  • Le modèle de présentation réagit à ce changement en définissant sa IsClosed propriété.

  • transferts de données liant cette valeur dans la MustClose de la vue.

  • La vue réagit à ce changement en se fermant.

Le modèle de présentation est tout à fait bien découplé de la vue, et vice versa, mais ceci est beaucoup de travail uniquement pour traiter une seule commande . Y at-il un moyen plus facile, étant donné le graphique de la dépendance que j'ai décidé sur?

Était-ce utile?

La solution

J'ai récemment conversion d'une application Windows Forms à l'architecture de MVP, et il semble que vous avez configuré vos dépendances d'une manière similaire à ce que je fais. Cependant, j'ai simplement une interface IPresenter qui définit des méthodes pour permettre à la vue de transmettre les demandes des utilisateurs. Comme l'a déjà vue une dépendance sur le présentateur et une référence à elle, il semble judicieux d'appeler simplement les méthodes de demande sur directement.

Alors dans mon système, le présentateur écoute les événements du modèle et ses propres feux d'événements de présentation pour une vue intéressés à écouter pour. La vue répond à ces événements par se mettre à jour le cas échéant, et transmet les demandes des utilisateurs au présentateur quand ils sont faits.

Autres conseils

est que mon avis.

Travailler avec le modèle de présentation nécessite 100% support de l'interface utilisateur pour la liaison de données. Même WPF ne font pas l'action proche que Bindable. Beaucoup de chose ne fonctionne pas en douceur dans le modèle de présentation comme MessageBox confirmation. même il peut être résumé avec interface Présentateur mais ne fonctionne toujours pas bon goût et de simplicité est sacrifié.

D'autre part, les principaux objectifs du modèle de présentation est de test La vue logique. Dans certains cas, si votre « Close Action » devrait être testé unitairement en raison de il y a une certaine logique avant qu'il est proche alors votre code est le seul choix. mais si elle est une simple confirmation « Etes-vous sûr de vouloir quitter » alors vous feriez mieux de mettre ça sur la vue pas dans le modèle de présentation, car il ne nécessite de test unitaire.

  

Le point de vue a une référence à la   modèle de présentation (mais pas vice   versa).

AFAIK la présentation devrait avoir une vue plus refference à exactement à l'interface IView afin que la présentation couple doesnt avec vue sur le béton. Ensuite, dans la classe de présentation que vous pouvez appeler des méthodes d'affichage et abonnez-vous pour afficher les événements via IView.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top