MVP: взаимодействие и создание презентеров
От: Legion13  
Дата: 24.01.08 06:44
Оценка:
Добрый день, хотел бы прояснить вопрос по презентерам в MVP.
Ситуация: два визуальных компонента (IView1, IView2), у каждого свои презентеры. Они размещаются на третьем компоненте (IView3). Пусть, например, View1 и View2 — комбобоксы, от которых приходит событие изменения активного значения. View3 должен получить измененные значения и на их основе выполнить некую операцию. Мне интересно, как лучше всего поступить:
View3 создает сам презентеры для View1 и View2, цепляется к их событиям, получает измененные данные и генерирует событие уже для своего презентера, который получает эти значения и на их основе уже производит изменения своего View3.
Либо: презентер для View3 создает сам презентеры View1 и View2 и подцепляет их. Но для этого IView3 должен вывести наружу свойства IView1 и IView2.
Или я вообще не тем путем иду?

Заранее благодарен!
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re: MVP: взаимодействие и создание презентеров
От: Ziaw Россия  
Дата: 24.01.08 09:39
Оценка: 2 (1)
Здравствуйте, Legion13, Вы писали:

L>Либо: презентер для View3 создает сам презентеры View1 и View2 и подцепляет их. Но для этого IView3 должен вывести наружу свойства IView1 и IView2.

L>Или я вообще не тем путем иду?
Используем этот вариант. Хорош тем, что в частных случаях проще всю логику реализовать в Presenter3 не разбивая ее на Presenter1, Presenter2 и их взаимодействие.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[2]: MVP: взаимодействие и создание презентеров
От: Legion13  
Дата: 24.01.08 09:57
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Используем этот вариант. Хорош тем, что в частных случаях проще всю логику реализовать в Presenter3 не разбивая ее на Presenter1, Presenter2 и их взаимодействие.


Спасибо, пока остановился тоже на нем, но не нравится явно выраженная зависимость IView3 от IView1 и IView2. Другой вариант тоже не нравится
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[3]: MVP: взаимодействие и создание презентеров
От: Ziaw Россия  
Дата: 24.01.08 10:08
Оценка:
Здравствуйте, Legion13, Вы писали:

L>Здравствуйте, Ziaw, Вы писали:


Z>>Используем этот вариант. Хорош тем, что в частных случаях проще всю логику реализовать в Presenter3 не разбивая ее на Presenter1, Presenter2 и их взаимодействие.


L>Спасибо, пока остановился тоже на нем, но не нравится явно выраженная зависимость IView3 от IView1 и IView2. Другой вариант тоже не нравится


Явная зависимость от того, что на View3 лежат IView1 и IView2 а не IView3 и IView4?

Думаю она неизбежна, т.к. логика завязана них. Можно конечно выделить из каждой логику комбокса, но это овердизайн уже будет.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re: MVP: взаимодействие и создание презентеров
От: alexandrST  
Дата: 24.01.08 12:11
Оценка: 3 (1)
L>View3 создает сам презентеры для View1 и View2, цепляется к их событиям, получает измененные данные и генерирует событие уже для своего презентера, который получает эти значения и на их основе уже производит изменения своего View3.
L>Либо: презентер для View3 создает сам презентеры View1 и View2 и подцепляет их. Но для этого IView3 должен вывести наружу свойства IView1 и IView2.

Доброго времени суток. По моему скромному мнению использовать нужно вариант 1, т.е.

презентер для View3 создает сам презентеры View1 и View2 и подцепляет их. Но для этого IView3 должен вывести наружу свойства IView1 и IView2.

Вариант 0 глубоко порочен, т.к. на мой взгляд View ничего не должен "знать" о презентерах, кроме как о своем собственном, конечно не может создавать презентеры, в том числе и для других View (про которые он впрочем не знает ). Страница View не является.
Насчет

не нравится явно выраженная зависимость IView3 от IView1 и IView2

— а что собственно не нравится ? С точки зрения семантики и ответственности никаких противоречий я считаю не имеется.
Использую такой подход успешно.

Например если бы у меня на странице лежал контрол Control3 который реализует IView3
то код был бы таким:

private IPresenter3 _presenter;
protected void Page_Load(object sender, EventArgs e)
{
  //некий код
  if(!IsPostBack)
  {
    _presenter.InitView();
  }
}


"некий код" == _presenter интанцируется через IoC, потом инициализируется. в качестве IView3 ему прописывается Control3.
в IPresenter3 есть свойства для IPresenter1 и IPresenter2 — аналогично внутри Presenter3 инстанцируются
презентеры для этих свойств, которым в качестве отображений прописываются IView1 и IView2 которые берутся из свойств IView3.

В качестве подопытного у меня в основном выступает контрол для работы с самописной вики.
Который соответственно может входить в состав других контролов.

Инициализация презентера для контрола который содержит в себе вики-контрол выглядит так:

        private INWikiPresenter _nWikiPresenter;
        public INWikiPresenter NWikiPresenter
        {
            get { return _nWikiPresenter; }
            private set { _nWikiPresenter = value; }
        }

        public InitMe(IQuestionView view, Guid questionUID, IStateStorage stateStorage)
        {
            AttachView(view);
            View.AttachPresenter(this);
            StateStorage = stateStorage;

            //некий код
  
            NWikiPresenter.InitMe(view.NWikiView, Question.DocumentUID);
            NWikiPresenter.AfterSaveInTransaction += OnNWikiAfterSaveInTransaction;
            NWikiPresenter.DocumentEdit += OnNWikiEdit;
            NWikiPresenter.Cancelled += OnNWikiCancelled;
            NWikiPresenter.DocumentSaved += OnNWikiSaved;
        }


О событиях которые выше: например для контрола который подопытный метод презентера для сохранения вики-документа выглядит так:
        public void SaveDocument(string body, string comment)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                RaiseEvent(BeforeSaveInTransaction);
                Document.Save(body, comment);
                RaiseEvent(AfterSaveInTransaction);
                scope.Complete();
            }
            RaiseEvent(DocumentSaved);

            if (StateStorage != null)
            {
                StateStorage.Write(Document.NWikiGuid, UniformKeys.DocumentUID);
            }
            Document.LoadHtml();
            SetEditMode(false);
        }


(здесь Document это свойство-сущность (грубо говоря), StateStorage — просто хранитель состояния куда можно сохранять данные. Например в презентер прописываю просто ViewState соответствующего контрола.)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.