MVP: Как ведущий получает доступ к свойствам представления?

#c# #.net #winforms #mvp

#c# #.net #winforms #mvp

Вопрос:

Я приведу полный пример, который компилирует:

 using System.Windows.Forms;
interface IView {
    string Param { set; }
    bool Checked { set; }
}
class View : UserControl, IView {
    CheckBox checkBox1;
    Presenter presenter;
    public string Param {
        // SKIP THAT: I know I should raise an event here.
        set { presenter.Param = value; }
    }
    public bool Checked {
        set { checkBox1.Checked = value; }
    }
    public View() {
        presenter = new Presenter(this);
        checkBox1 = new CheckBox();
        Controls.Add(checkBox1);
    }
}
class Presenter {
    IView view;
    public string Param {
        set { view.Checked = value.Length > 5; }
    }
    public Presenter(IView view) {
        this.view = view;
    }
}
class MainClass {
    static void Main() {
        var f = new Form();
        var v = new View();
        v.Param = "long text";
        // PROBLEM: I do not want Checked to be accessible.
        v.Checked = false;
        f.Controls.Add(v);
        Application.Run(f);
    }
}
  

Это довольно простое приложение. У него есть пользовательский элемент управления MVP. Этот пользовательский элемент управления имеет общедоступное свойство Param , которое управляет его внешним видом.

Моя проблема в том, что я хочу скрыть Checked свойство от пользователей. Он должен быть доступен только презентатору. Возможно ли это? Я делаю что-то совершенно неправильное? Пожалуйста, посоветуйте!

Ответ №1:

Вы не можете полностью скрыть это от конечного пользователя, и, честно говоря, вам это и не нужно. Если кто-то хочет использовать ваш пользовательский элемент управления напрямую, ваш элемент управления должен быть достаточно тупым, чтобы просто отображать свойства, которые установлены для него, независимо от того, были ли они установлены через presenter или нет.

Однако лучшее, что вы можете сделать (если вы все еще настаиваете на сокрытии этих свойств от своего пользователя), IView — это явно реализовать:

 class View : UserControl, IView {
    CheckBox checkBox1;
    Presenter presenter;
    string IView.Param {
        // SKIP THAT: I know I should raise an event here.
        set { presenter.Param = value; }
    }
    bool IView.Checked {
        set { checkBox1.Checked = value; }
    }
    public View() {
        presenter = new Presenter(this);
        checkBox1 = new CheckBox();
        Controls.Add(checkBox1);
    }
  

Таким образом, если кто-то просто делает:

 var ctl = new View();
  

у них не будет доступа к этим свойствам.

Комментарии:

1. 1 за то, что сказал, что вам не нужно беспокоиться. Проверка кода должна выявить такого рода злоупотребления 🙂 Но у пользователя будет доступ, если он ссылается на него через an IView , а не через a View , что довольно легко получить : IView view = new View();