МВП пассивный-вид


Во-первых, я очень новой для шаблон проектирования МВП (пассивный вид) и я пытаюсь его реализовать в WinForms приложения.

Прежде чем я пойду дальше, я буду очень рад, если вы, ребята, можете дать мне обратную связь по моей нынешней работе.

Solution Explorer structure

The Form

Модель:

public class PersonModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Gender { get; set; }

    public PersonModel(string firstName, string lastName, string gender)
    {
        FirstName = firstName;
        LastName = lastName;
        Gender = gender;
    }
}

Ведущий:

public class ManagePersonPresenter
{
    private readonly IManagePersonFormView _view;
    private readonly List<PersonModel> _models;

    public ManagePersonPresenter(IManagePersonFormView view)
    {
        _view = view;
        _models = new List<PersonModel>();

        Initialize();
    }

    private void Initialize()
    {
        _view.AddButtonEnabled = false;
        _view.InputGenderMale = true;
    }

    public void OnSaveButtonClicked()
    {
        var person = new PersonModel(_view.InputFirstName, _view.InputLastName, GetGender());

        _view.AddButtonEnabled = false;
        _view.InputFirstName = null;
        _view.InputLastName = null;

        _models.Add(person);

        _view.ShowMessage("Successfully added person '" + person.FirstName + @"'.");

        RefreshTable();
    }

    public void OnTextChanged()
    {
        if (_view.InputFirstName == string.Empty || _view.InputLastName == string.Empty)
        {
            _view.AddButtonEnabled = false;
        }
        else
        {
            _view.AddButtonEnabled = true;
        }
    }

    public void RefreshTable()
    {
        var dt = new DataTable();
        dt.Columns.Add("First name");
        dt.Columns.Add("Last name");
        dt.Columns.Add("Gender");

        foreach (var person in _models)
        {
            dt.Rows.Add(person.FirstName, person.LastName, person.Gender);
        }

        _view.DtPersons = dt;
    }

    private string GetGender()
    {
        return _view.InputGenderMale ? "Male" : "Female";
    }
}

Вид:

public interface IManagePersonFormView
{
    string InputFirstName { get; set; }
    string InputLastName { get; set; }
    bool InputGenderMale { get; set;  }
    bool InputGenderFemale { get; set; }
    DataTable DtPersons { set; }
    bool AddButtonEnabled { get; set; }
    void ShowMessage(string message);
}

Форме:

public partial class FrmManagePersons : Form, IManagePersonFormView
{
    private readonly ManagePersonPresenter _presenter;

    public FrmManagePersons()
    {
        InitializeComponent();

        _presenter = new ManagePersonPresenter(this);
    }

    public string InputFirstName
    {
        get => txtBoxFirstName.Text;
        set => txtBoxFirstName.Text = value;
    }

    public string InputLastName
    {
        get => txtBoxLastName.Text;
        set => txtBoxLastName.Text = value;
    }

    public bool AddButtonEnabled
    {
        get => btnSavePerson.Enabled;
        set => btnSavePerson.Enabled = value;
    }

    public bool InputGenderMale
    {
        get => rdBtnGenderMale.Checked;
        set => rdBtnGenderMale.Checked = value;
    }

    public bool InputGenderFemale
    {
        get => rdBtnGenderFemale.Checked;
        set => rdBtnGenderFemale.Checked = value;
    }

    public DataTable DtPersons
    {
        set => dtGridPersons.DataSource = value;
    }

    public void ShowMessage(string message)
    {
        MessageBox.Show(message, @"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

    private void btnSavePerson_Click(object sender, EventArgs e)
    {
        _presenter.OnSaveButtonClicked();
    }

    private void txtBoxFirstName_TextChanged(object sender, EventArgs e)
    {
        _presenter.OnTextChanged();
    }

    private void txtBoxLastName_TextChanged(object sender, EventArgs e)
    {
        _presenter.OnTextChanged();
    }

    private void dtGridPersons_SelectionChanged(object sender, EventArgs e)
    {
        dtGridPersons.ClearSelection();
    }

    private void btnRefreshTable_Click(object sender, EventArgs e)
    {
        _presenter.RefreshTable();
    }
}


468
8
задан 26 марта 2018 в 07:03 Источник Поделиться
Комментарии
1 ответ

Ваша точка зрения вызывает методы на свой ведущий. Мнение не должен знать ведущий существует. Вместо того, чтобы вызвать ведущего прямо, взгляд должен вызывать события, что ведущий реагирует. Разница кажется банальным за то, что вы здесь, но он может сделать очень большая разница на более крупные и более сложные системы.

О, и я должен упомянуть о некоторых других вещах.


  1. Пол не бинарный опцион.

  2. Имена гораздо сложнее, чем первый и последний.

6
ответ дан 31 марта 2018 в 10:03 Источник Поделиться