2009-11-05 20 views
6

J'apprends le modèle Passive View pour garder mon application C# WinForms plus facile à tester et à maintenir.Quelle est la meilleure façon d'implémenter des événements dans Passive View?

Cela a bien fonctionné jusqu'à présent, mais je me demande s'il existe une meilleure façon d'implémenter Evénements que je ne le fais maintenant (et de les garder testables). C'est à quoi il ressemble (en omettant le code non pertinent pour cet exemple). Fondamentalement ce que je cherche s'il y a un moyen d'ignorer les événements à la fois dans le présentateur et dans le formulaire, je préférerais faire tout le travail dans le présentateur.

Mon point de vue ressemble à ceci:

public interface IApplicationView 
{ 
    event EventHandler Find; 
} 

Mon présentateur ressemble à ceci:

public class ApplicationPresenter 
{ 
    private IApplicationView _view; 
    private IApplicationDomain _domain; 

    public ApplicationPresenter(IApplicationView view) : this(view, new ApplicationDomain()) {} 
    public ApplicationPresenter(IApplicationView view, IApplicationDomain domain) { 
     _view = view; 
     _domain = domain; 

     HookupEventHandlersTo(view); 
    } 

    private void HookupEventHandlersTo(IApplicationView view) 
    { 
     view.Find += delegate { FindAction(); }; 
    } 

    public void FindAction() 
    { 
     // ... 
    } 
} 

Mon WinForm ressemble:

public partial class Form1 : Form, IApplicationView 
{ 
    private ApplicationPresenter _presenter; 
    public event EventHandler Find = delegate {}; 

    public Form1() 
    { 
     InitializeComponent(); 
     _presenter = new ApplicationPresenter(this); 
     HookupEvents(); 
    } 

    private void HookupEvents() 
    { 
     searchButton.Click += Find; 
    } 
} 

Merci!

+0

Je ne peux pas vous aider mais ce que vous demandez à propos de semble intéressant. Pourriez-vous me diriger vers votre ressource en ligne préférée qui décrit la technique que vous essayez de mettre en œuvre? –

+0

@Jay - Une recherche rapide sur Google de "Model View Presenter" devrait vous donner toutes les informations dont vous avez besoin. – Josh

+0

@Jay Martin Fowler a inventé le modèle de conception Passive View lorsqu'il a retiré le modèle MVP et l'a divisé en deux nouveaux. Où Passive View est l'un d'entre eux, voir http://martinfowler.com/eaaDev/PassiveScreen.html – devghost

Répondre

3

Une autre grande ressource pour l'apprentissage MVP avec WinForms est Jeremy Millers série Build Your Own CAB. J'ai trouvé ce incroyablement utile quand j'apprenais,

L'article sur View to Presenter Communication sera utile pour vous; il y a une bonne discussion ici sur l'utilisation des événements vs faire des appels directs. Mieux encore, l'article Event Aggregator présente un mécanisme de "publication/abonnement" qui peut être utilisé à la place des événements, tout en gardant le code testable. C'est l'approche que je préfère personnellement et qui a eu du succès avec.

+0

L'Event Aggregator a l'air intéressant, je vais y jeter un coup d'oeil ce week-end et voir comment ça se passe. – devghost

0

Découvrez un exemple d'implémentation de la vue passive à this. Il a un bon moyen de câblage/déconnexion pour les événements entre la vue et le contrôleur qui met la plupart du travail dans le contrôleur.

+0

Mauvais liens. L'ancien et le nouveau. S'il vous plaît ne pas poster de liens externes sur SO. Ils ont tendance à être mis hors service. – Heliac