Model View Presenter Интерфейс Вопрос? - PullRequest
0 голосов
/ 08 июня 2009

Мне нужна ваша помощь, чтобы понять MVP. Я использовал интерфейс (IProductEditorView). Если вы посмотрите ниже, вы можете увидеть уровень представления:

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

}

Если вы посмотрите ниже, вы увидите; это смешивает мою голову, потому что ProductListPresenter(IProductEditorView view), но они хотят, чтобы я добавил (this). Я не понимаю, почему"this.mPresenter = new ProductListPresenter(this);"?

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

Ответы [ 4 ]

1 голос
/ 10 июня 2009

Представление "this" в контексте страницы ASP.NET представляет собой "Page". Когда я начал работать с MVP, я нашел серию Polymorphic Podcast on MV Patterns действительно полезной.

0 голосов
/ 04 сентября 2009

Я сделал MVP так, чтобы у докладчика был один метод Initialize, который принимает представление в качестве аргумента. Один из способов думать о MVP состоит в том, что докладчик манипулирует представлением через интерфейс представлений. Давайте возьмем пример, когда при нажатии на событие OnClick кнопки «Сохранить» вы хотите, чтобы предварительный клиент сохранил продукт и не имел этот код в коде позади страницы. Вы можете написать что-то вроде этого:

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

где productBuilder отвечает за создание продукта для вас. Вы действительно хотите попробовать программирование на основе интерфейса / контракта, а не создавать конкретные объекты непосредственно в ваших классах. Также Джереми Миллер создал вики о шаблонах презентаций, которые могут быть полезны для описания этого шаблона даже более подробно. Это можно увидеть здесь

0 голосов
/ 08 июня 2009

Предполагая, что вторая часть кода является видимой, есть проблема с вашей реализацией шаблона MVP.

В вашем проекте и презентатор, и представление знают друг о друге (Presenter принимает представление в своем конструкторе, а представление устанавливает его выступающего в OnInit).

Это проблема, потому что вы используете MVP для разделения представления и презентатора, но этот дизайн делает их тесно связанными. Ваш докладчик не должен знать о вашем представлении, поэтому вы можете удалить параметр IProductEditorView из конструктора докладчиков.

Затем вам нужно изменить свой метод сохранения следующим образом:

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

И, на ваш взгляд, когда вам нужно сохранить продукт, подготовьте его и передайте докладчику:

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

OnInit вашего взгляда остается прежним.

0 голосов
/ 08 июня 2009

Если предположить, что второй блок кода является частью кода формы asp.net, то я могу представить, что форма asp.net реализует интерфейс IProductEditorView, и, таким образом, вы передаете представление (это) докладчику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...