Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Использование патерна MVP


Автор: infarch 31.10.2013, 17:21
Здравствуйте.

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

Код

    public partial class MainForm : Form
    {
        MainPresenter presenter;

        public MainForm()
        {
            InitializeComponent();
            presenter = new MainPresenter(this);
        }
    }


Теперь представление принимает события от формы и передает в модель. Пока все понятно.
Но вот мне понадобилось отобразить еще одну форму для заполнения и потом вернуться в главную. Вопрос: где правильнее разместить этот код? В модели, представлении или главной форме? Я вообще склоняюсь к тому что в представлении, но так ли это?..

Автор: dzaraev 1.11.2013, 07:35
Во-первых закройте MainForm абстракцией, например IMainView, иначе MVP нафиг не нужен.
Далее, ИМХО конечно, но в 99.9% случаев решение о показе диалогов и доп. окон должен принимать Презентер, а значит ему необходимо предоставить соответствующую инфраструктуру, либо добавить соответствующие методы в само представление. Например добавить метод IMainView.NotifyUser(string message) и вызывать его из презентера тогда, когда он (презентер) посчитает нужным. Форма же реализует этот интерфейс и делает что-то вроде MessageBox.Show и т.д.  
Таким образом вы полностью отвязываете  презентер от специфических классов UI слоя (MainForm, MessageBox и т.д.) и делаете возможным заменить реализацию представления на любую другую (что является одной из основных фичей MVP и подобных шаблонов).

Автор: infarch 1.11.2013, 11:22
Поскольку я к этому патерну только присматриваюсь, то сразу все детали не охватил. Допустим, я завернул форму в IMainView. Как мне привязать презентер к кнопке на форме? Не угостите ли годным примером, желательно попроще? И вот еще вопрос: вы пишете "делаете возможным заменить реализацию представления на любую другую". Вы имеете в виду presenter или view? Если презентер, то я не понимаю, зачем его на что-то менять? Другое дело вью, там можно сменить форму на асп страницу например.

Автор: dzaraev 1.11.2013, 14:03
Цитата(infarch @  1.11.2013,  11:22 Найти цитируемый пост)
Допустим, я завернул форму в IMainView. Как мне привязать презентер к кнопке на форме?

В идеале презентер ни про какие "батоны" и "камбабоксы" знать не должен, он должен по возможности работать с более предметной семантикой. 
Например: ваша кнопка должна приводить к подтверждению ввода пользователя, вы высовываете в IMainView событие SubmitRequested и реализуете его в MainForm. Затем вы добавляете обработчик на клик кнопочки (внутри MainForm) и в этом обработчике вызываете OnSubmitRequested. Презентер при получении в себя IMainView должен подписаться на данное событие и в ответ на него что-то адекватное сделать. Ну допустим он поковыряет данные, которые пользователь пытается сабмитить и решит - можно сабмитить или нет, если нет, то презентер вызовет IMainView.NotifyUser("нельзя сохранить, вы не ввели ФИО"). Если же всё в порядке, то презентер может протолкнуть данные ниже - в слой модели, а представлению сказать что-то типа IMainView.NotifyUser("аккаунт успешно сохранён").

Цитата(infarch @  1.11.2013,  11:22 Найти цитируемый пост)
 вы пишете "делаете возможным заменить реализацию представления на любую другую".  Вы имеете в виду presenter или view? 

Конечно я имел в виду View, просто по-русски - "view" это "представление".


Автор: infarch 1.11.2013, 14:45
Ситуация проясняется... Спасибо за ответ, осмыслю и опробую.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)