2010-12-02 6 views
2

J'implémente le modèle MVP avec Windows Form et j'ai une question sur l'implémentation actuelle car j'essaie de l'intégrer dans une architecture plus complexe. En ce moment j'ai une vue agnostique totale avec des propriétés, un présentateur qui injecte la vue dans le constructeur et la vue qui a une instance du présentateur. Voici le code: VoirMVP Flow question

public class MyView : IMyView 
{ 
    public MyView() 
    { 
     var presenter = new MyPresenter(this); 
     presenter.Init(); 
    } 
} 

C'est le Présentateur

public class MyPresenter 
{ 
    private IMyView view; 
    private MyModel model; 
    // 
    public MyPresenter(IMyView view) 
    { 
     // injection 
     this.view = view; 
    } 
} 

De cette façon, je peux accomplir deux tâches:

  • méthodes d'appel sur le présentateur de the View
  • Intéragir avec le Voir de le présentateur Maintenant, j'ai deux questions:
  • Pour tout orchestrer j'utilise le conteneur IoC pour que je puisse facilement écrire du code comme celui-ci:

    var view = ioc.Resolve<IMyView>(); 
    var presenter = ioc.Resolve<MyPresenter>(); //view injected 
    NavigationService.Show(presenter.View); 
    

    Jusqu'à présent, si bon.

  • Première question: comment puis-je récupérer le modèle à partir du Presenter lorsque le travail est terminé? Le présentateur utilisé par la vue n'est pas le même que celui que j'utilise depuis le conteneur IoC car la vue instancie un nouveau présentateur ... donc le modèle exposé par le présentateur n'est pas le même que celui utilisé par le présentateur instancié dans la vue

  • Deuxième question: comment je peux passer un modèle existant à cette triade MVP quand j'ai un? Par exemple, comment puis-je faire fonctionner ce code pour un Détails Voir où le modèle provient d'un référentiel?

Répondre

0

Sur la base de ce que je changerai tout en inversant les dépendances. La vue maintenant ne crée pas une instance d'un présentateur, mais il obtient un injecté par le présentateur lui-même de la manière suivante:

public MyPresenter(IView myView, Model myModel) 
{ 
    this.View = myView; 
    this.View.Presenter = this; 
    this.Model = myModel; 
} 

Jusqu'à présent, si bon. maintenant du côté de la vue, le présentateur est exposé comme en écriture seule propriété de sorte qu'il ne peut être modifié par la vue, mais il peut être utilisé:

public class MyView : IView 
{ 
    public MyPresenter Presenter { get; private set; } 
} 

Jusqu'à présent, si bon. Maintenant, le IoC fera ceci:

var view = IoC.Resolve<IView>(); 
var model = repository.GetModel(); // or new Model(); 
var presenter = IoC.Resolve<MyPresenter>(); //view and model injected 
presenter.ShowView(); 
var result = presenter.Model; 

Pour moi, il semble bien, mais je veux juste être sûr que je ne suis pas brisant la logique de MVP.

3

Pour avoir une approche plus propre du modèle injectent au présentateur, aussi

public class MyPresenter 
{ 
    private IMyView view; 
    private MyModel model; 

    public MyPresenter(IMyView view, MyModel model) 
    { 
     this.view = view; 
     this.model = model 
    } 
} 

En faisant cela, vous avez toujours une référence au modèle extérieur du présentateur où vous l'avez créé. Lorsque vous le faites comme cela, vous pouvez toujours choisir le modèle que vous souhaitez utiliser. Par exemple, si votre backend (modèle) n'est pas fini, vous pouvez écrire un Mock-modèle (lorsque vous utilisez une interface pour le modèle) pour tester votre présentateur et votre point de vue.

Hope this aidé

+0

Ok, je n'ai pas pensé à ce type de solution. – Raffaeu