2009-06-08 8 views
0

J'ai besoin de votre aide pour comprendre MVP. J'ai utilisé une interface (IProductEditorView). Si vous regardez ci-dessous vous pouvez voir la couche de présentation:Question de l'interface du présentateur de modèle?

using System; 
using System.Collections.Generic; 
using System.Text; 
using MVPProject.BusinessLayer; 

namespace MVPProject.PresentationLayer 
{ 
    public interface IProductEditorView 
    { 
     int ProductID { get;} 
     string ProductDescription { get; } 

     event EventHandler<EventArgs> Save; 
    } 

    public class ProductEditorPresenter 
    { 
     private IProductEditorView mView; 

     public ProductEditorPresenter(IProductEditorView view) 
     { 
      this.mView = view; 
      this.Initialize(); 
     } 

     private void Initialize() 
     { 
      this.mView.Save += new EventHandler<EventArgs>(mView_Save); 
     } 

     private void mView_Save(object sender, EventArgs e) 
     { 
      Product product; 
      try 
      { 
       product = new Product(); 
       product.Description = mView.ProductDescription; 
       product.ID = mView.ProductID; 
       product.Save(); 
      } 
      catch (Exception ex) 
      { 
       System.Diagnostics.Debug.WriteLine(ex.Message); 
       throw; 
      } 
     } 
    } 

} 

Si vous regardez ci-dessous vous pouvez voir; c'est mélanger ma tête parce que ProductListPresenter(IProductEditorView view) mais ils veulent me ajouter (this). Je ne comprend pas pourquoi "this.mPresenter = new ProductListPresenter(this);"?

private ProductListPresenter mPresenter; 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     this.mPresenter = new ProductListPresenter(this); 
    } 
+1

devrait probablement supprimer la balise asp.net-mvc. – DSO

Répondre

0

En supposant que le second bloc de code fait partie d'un code de formulaire asp.net derrière, alors je peux imaginer que la forme asp.net implémente l'interface IProductEditorView et donc vous passez la vue (ce) à le présentateur.

0

Si l'on suppose que la deuxième partie du code est de la vue, il y a un problème avec votre mise en œuvre du modèle MVP.

Dans votre conception, à la fois présentateur et vue connaît l'autre (Présentateur accepte le point de vue dans son constructeur et vue fixe son présentateur sur OnInit).

Ceci est un problème parce que vous utilisez MVP pour le découplage vue et le présentateur, mais cette conception les rend étroitement couplées. Votre présentateur n'a pas besoin de connaître votre vue, vous pouvez donc supprimer le paramètre IProductEditorView du constructeur des présentateurs.

Ensuite, vous devez changer votre méthode de sauvegarde à ceci:

private void Save(Product product) 
{ 
    try 
    { 
     product.Save(); 
    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.WriteLine(ex.Message); 
     throw; 
    } 
} 

Et vous, lorsque vous devez enregistrer le produit, préparer et transmettre au présentateur:

private btnSaveProduct_Click(object sender, EventArgs e) 
{ 
    Product product; 
    product.Description = txtDescription.Text; 
    // Set other properties or the product 
    this.mPresenter.Save(product); 
} 

OnInit de votre vue reste le même.

+0

Merci vous allez bien! Teşekkürler dostum. Benim meesengerım: [email protected] eklersen tanışırız ... – Penguen

0

La façon dont je l'ai fait MVP est d'avoir le présentateur ont une seule méthode appelée Initialiser qui considère comme un argument. Une façon de penser à MVP est que le présentateur manipule la vue à travers l'interface des vues. Prenons l'exemple que lorsque vous cliquez sur l'événement OnClick du bouton de sauvegarde, vous voulez que le presneter enregistre le produit et ne l'ait pas directement dans le code derrière la page. Vous pouvez coder quelque chose comme ceci:

public class ProductEditorPresenter 
{ 
    public void Initialize(IProductEditorView view, IProductBuilder productBuilder) 
    { 
     view.SaveProduct += delegate 
          { 
           var product = productBuilder.Create(view.ProductId, view.ProductDescription); 
           product.Save(); 
          } 
    } 
} 

où productBuilder gère la création du produit pour vous. Vous voulez vraiment essayer de faire une programmation basée sur l'interface/contrat et ne pas créer d'objets concrets directement dans vos classes. Jeremy Miller a également créé un wiki sur les modèles de présentation qui pourrait être utile pour décrire ce modèle de manière plus détaillée. Cela peut être vu here

Questions connexes