У меня проблема с реализацией шаблона MVP в C # и Asp.net - PullRequest
0 голосов
/ 09 сентября 2011

Я создал систему форумов в шаблоне MVP, но я не уверен, правильно ли я ее реализовал. вот что я закончил:

  • Я создал базу данных, в которой есть три таблицы: форумы, темы, сообщения
  • добавил новый типизированный набор данных в проект, а затем перетащил в него все таблицы
  • создал три новых calsses: ForumsModel, ThreadsModel, PostsModel
  • добавлены три интерфейса: IForumView, IThreadView, IPostView
  • еще три класса: ForumsPresenter, ThreadSresenter, PostsPresenter

внутри классов модели я просто вызываю типизированные методы набора данных, а в Presenter я вызываю методы модели. просмотры .aspx страниц. это все, что есть для системы форумов, но вот сложная часть:

поскольку шаблон MVP является шаблоном пользовательского интерфейса, я должен выполнить проверку данных в самом приложении. так что с моим дизайном MVP это приложение!

что я сделал не так ??

edit 1: Прежде всего о том, почему я выбрал типизированный набор данных с хранимыми процедурами по сравнению с другими вариантами: это самый легкий поставщик данных, который не ставит под угрозу любую имеющуюся у вас архитектуру. другие варианты - прямой sql, который не является хорошим вариантом для вновь создаваемого приложения, классы LINQ to sql, которые слишком тяжелы для создания экземпляра при каждом запросе, Entity Framework, который хорош, но слишком велик для такой простой задачи! по крайней мере, если бы я создавал блог-движок, это был бы мой первый выбор. Что касается того, почему я не выбрал MVC, то это потому, что я думаю, что MVP - лучший шаблон, поскольку он даст мне полное разделение различных частей моего приложения. в конце концов, это вопрос времени, но вы должны быть в состоянии реализовать любой шаблон, верно? Я видел разные варианты MVP, но я пытаюсь реализовать следующее:

model<------------->presenter<-------------->view

опция databind предназначена для шаблона модели представления, представленного Мартином Фаулером, насколько я помню, но я пытаюсь создать версию для Microsoft, которая в основном является расширенной версией шаблона PM.

два дня назад я задал вопрос о проверке данных, и кто-то предложил мне сделать это в «самом приложении», поэтому, когда я спросил, где находится это «приложение», он сказал, что MVP - это шаблон пользовательского интерфейса, и он не должен быть вашим «Приложением», и вы должны реализовать MVP на уровне пользовательского интерфейса. вот почему я задал этот вопрос в первую очередь!

Ответы [ 4 ]

2 голосов
/ 09 сентября 2011

С MVP код позади становится реализацией View, основанной на интерфейсе View.

Интерфейс View содержит события страницы, к которым Presenter необходимо будет привязаться, чтобы также изменить состояние View.в качестве свойств и методов это может понадобиться.Например, он может перехватить событие onLoad и вызвать View, чтобы изменить его состояние.При этом он не зависит от реализации View и ничего не знает об элементах управления.Это означает, что вы можете писать модульные тесты без экземпляра ASPX.

Чтобы создать механизм MVP, который автоматизирует подключение, вы должны использовать базовую страницу, универсальные шаблоны и IoC.IoC позволяет вам устанавливать переопределения зависимостей для таких вещей, как WebContextBase, который виден только этому конвейеру запросов и который может быть передан вашему конструктору Presenter.

IoC также позволяет вам вводить другие зависимости в Presenter, чтобы помочьДержите это легким весом.Таким образом, вы можете перенести бизнес и доступ к данным на другие уровни.

MVP действительно полезен, когда у вас есть для использования веб-форм, как, например, в большинстве систем CMS.Если вы не ограничены, то используйте MVC.Net для новой веб-разработки.

Обновление: как и обещано, это довольно достойный пример .Бит, который он пропускает - это переопределение зависимостей, которое можно сделать так:

var dependencies = new DependencyOverrides
                    {
                        {typeof (HttpRequestBase),new HttpRequestWrapper(Request)},
                        {typeof (HttpResponseBase),new HttpResponseWrapper(Response)},
                        {typeof (IPrincipal),Context.User},
                        {typeof (IIdentity),Context.User.Identity},
                        {typeof (IUserProfile),Context.User.Profile},
                        {typeof (HttpSessionStateBase),new HttpSessionStateWrapper(Session)}
                    };

presenter = container.Resolve<TPresenter>(dependencies);
0 голосов
/ 09 сентября 2011

Вы смотрели на ASP.NET MVC ? Это паттерн Model-View-Controller, который будет обрабатывать все маршруты и соединения для вас. Вы получите легкую проверку модели с помощью DataAnnotations , и есть множество ресурсов и учебных пособий

Или есть конкретная причина, по которой вам нужно использовать шаблон MVP с классическим ASP.NET?

0 голосов
/ 09 сентября 2011

Поскольку ваш вопрос был не о достоинствах MVC против MVP или Typed Dataset против Entity Framework, я предполагаю, что у вас есть веские основания делать то, что вы делаете.

Учитывая это, вы, похоже, не делаете ничего плохого. В MVP проверка должна происходить в реализациях Presenter, так как они имеют доступ к экземплярам вашего представления во время обратных передач. Конечно, вы также можете использовать проверку на стороне клиента с javascript.

0 голосов
/ 09 сентября 2011

Вы допустили архитектурную ошибку, выбрав веб-формы вместо среды ASP.NET MVC. Также типизированные наборы данных 2003 года, вы должны использовать Entity Framework. Получить со временем!

...