MVP — Должен ли ведущий использовать сеанс?

Я использую шаблон Model-View-Presenter для веб-страницы. Должен ли ведущий знать о сеансе или только представление должно знать об этом?

Я предполагаю, что я имею в виду, что такие понятия, как сеанс, очень связаны с архитектурой представления, поэтому должны ли они быть ограничены использованием представления? В противном случае, что произойдет, если я захочу повторно использовать презентатор на аналогичной странице в другой архитектуре (или мне не нужно беспокоиться об этом, если у меня нет планов сделать это)?


person Simon Keep    schedule 03.11.2008    source источник


Ответы (7)


Я делаю что-то подобное в своей реализации MVP. Я внедряю ICookieManager, ISessionManager, ICacheManager, IConfigurationManager, IRedirector в свой презентатор, которые реализуются классами, которые обертывают функциональные возможности для этого.

Это позволяет использовать презентатор, в который вы можете внедрять их фиктивные версии, и у вас нет прямых зависимостей от среды выполнения asp.net в вашем презентере, что упрощает тестирование.

Ваше здоровье

person Community    schedule 03.11.2008

Это может быть даже общий модуль, действующий как обертка любого сеанса, который вы используете. Таким образом, он будет доступен для всех ваших контроллеров, и вы сможете просто изменить физическую реализацию сеанса.

Ваш докладчик заполнил бы представление тем, что контроллер извлек из сеанса.

person dove    schedule 03.11.2008

Всем спасибо за ответы, подытожу...

Говорим ли мы, что на самом деле Presenter должен иметь доступ к данным из сеанса (желательно через интерфейс), а его представление не должно обращаться к ним (оставаясь тупым)?

person Simon Keep    schedule 03.11.2008
comment
Это мое мнение о нем, да. - person Duncan; 06.11.2008

Зависит от того, какой объект вы пытаетесь повторно использовать или иным образом содержит большую часть бизнес-логики.

Я бы предположил, что только ведущий должен знать о сеансе, поскольку этот объект ближе всего к контроллеру в MVP.

person Quibblesome    schedule 03.11.2008

Да, как говорит голубь, оберните все, что обращается к сеансу, в другой класс.

Это означает, что вы можете внедрить фиктивный класс этого типа для имитации различных значений для сеанса.

Чтобы ответить на ваш вопрос более конкретно, я склоняюсь к шаблону Supervising-Presenter (http://martinfowler.com/eaaDev/SupervisingPresenter.html), что делает представления ОЧЕНЬ тупыми. Таким образом, только Presenter будет получать доступ к сеансу (хотя и не напрямую, как я сказал ранее) и указывать представлению, что делать.

person Duncan    schedule 03.11.2008

Я также изучаю пассивные подходы MVP. Я видел несколько вещей, сделанных в Интернете, обе из которых оставляют сохранение сеанса на усмотрение — либо посредством инъекции, как упомянул голубь, либо явным управлением.

Примеры внедрения зависимостей можно увидеть здесь: http://www.codeproject.com/KB/aspnet/Advanced_MVP.aspx и здесь: http://geekswithblogs.net/opiesblog/archive/2006/06/30/83743.aspx. Хитрость здесь заключается в том, чтобы управлять всеми экземплярами сеанса в статической переменной и предотвращать их перезапись друг друга. (Я не уверен, что первый пример выполняет это правильно.)

Второй подход здесь: http://codebetter.com/blogs/jeffrey.palermo/archive/2005/03/28/128592.aspx. В этом примере представление знает, как сохранить свое состояние. Недостатком является то, что каждый раз, когда презентатор помещает данные в представление, он должен вызывать метод Update в представлении, чтобы принудительно выполнить повторную привязку. В приведенных выше примерах это не требуется, но вам не нужно управлять таблицей сеансов. Я не уверен, как этот подход усложняет тестирование с помощью инструментов для насмешек.

person Community    schedule 17.11.2008

Совет заключается в том, чтобы взаимодействовать с каждым расходуемым объектом. Это упрощает тестирование ведущего и модели с помощью насмешек и фокусирует тесты на поведении.

person Community    schedule 18.12.2008