0 votes

Interface de question du présentateur de la vue du modèle ?

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:

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 Save;
    }

    public class ProductEditorPresenter
    {
        private IProductEditorView mView;

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

        private void Initialize()
        {
            this.mView.Save += new EventHandler(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, cela me mélange la tête car ProductListPresenter(IProductEditorView view) mais ils veulent que j'ajoute (this). Je ne comprends pas pourquoi "this.mPresenter = new ProductListPresenter(this);" ?

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

1voto

Junto Points 5597

La vue, "this", dans le contexte d'une page ASP.NET est la "Page". Quand j'ai commencé à comprendre le MVP, j'ai trouvé la série de baladodiffusions polymorphiques sur les modèles MV vraiment utile.

0voto

Pedro Santos Points 484

En supposant que le deuxième bloc de code fasse partie d'un code en arrière-plan d'un formulaire asp.net, alors je peux imaginer que le formulaire asp.net implémente l'interface IProductEditorView et donc vous passez la vue (this) au présentateur.

0voto

Serhat Özgel Points 10010

En supposant que la deuxième partie du code est de la vue, il y a un problème avec votre implémentation du pattern MVP.

Dans votre conception, à la fois le présentateur et la vue se connaissent mutuellement (le présentateur accepte la vue dans son constructeur et la vue définit son présentateur sur OnInit).

C'est un problème car vous utilisez MVP pour découpler la vue et le présentateur mais cette conception les rend fortement liés. Votre présentateur n'a pas besoin de connaître votre vue, vous pouvez donc supprimer le paramètre IProductEditorView du constructeur du présentateur.

Ensuite, vous devez modifier votre méthode de sauvegarde comme ceci :

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

Et dans votre vue, lorsque vous devez sauvegarder le produit, préparez-le et passez-le au présentateur :

private btnSaveProduct_Click(object sender, EventArgs e)
{
    Product product;
    product.Description = txtDescription.Text;
    // Définir les autres propriétés du produit
    this.mPresenter.Save(product);
}

OnInit de votre vue reste le même.

0voto

Michael Mann Points 616

La façon dont j'ai implémenté le MVP est d'avoir le présentateur avoir une méthode unique appelée Initialize qui prend la vue comme argument. Une façon de penser au MVP est que le présentateur manipule la vue à travers l'interface de la vue. Prenons l'exemple où, lorsque l'événement OnClick du bouton de sauvegarde est cliqué, vous voulez que le présentateur enregistre le produit et non pas avoir ce code dans le code-behind de la page directement. Vous pourriez 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ù le productBuilder gère la création du produit pour vous. Vous voulez vraiment essayer de faire de la programmation basée sur des interfaces/contrats et ne pas créer d'objets concrets directement dans vos classes. De plus, Jeremy Miller a créé un wiki sur les modèles de présentation qui peut être utile pour décrire ce modèle encore plus en détail. Cela peut être vu ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X