2010-04-05 4 views
6

У меня есть страница ASP.NET Web Forms, которую презентатору необходимо заполнить элементами управления. Это взаимодействие несколько чувствительно к жизненному циклу страницы, и мне было интересно, есть ли у него трюк, о котором я не знаю.Разделение представления, презентации и веб-форм ASP.NET

Я хочу быть практичным во всем, но не подвергать риску испытания.

В настоящее время у меня есть это:

public interface ISomeContract 
{ 
    void InstantiateIn(System.Web.UI.Control container); 
} 

Этот договор имеет зависимость от System.Web.UI.Control и мне нужно, чтобы быть в состоянии сделать вещи с веб-форм ASP.NET модель программирования. Но ни представление, ни ведущий могут не знать об элементах управления ASP.NET.

Как мне обойти это? Как я могу работать с моделью программирования ASP.NET Web Forms в своих конкретных представлениях, не принимая зависимость System.Web.UI.Control в моих контрактных сборках?

Чтобы немного прояснить ситуацию, этот тип интерфейса связан с составом пользовательского интерфейса (с использованием MEF). Это известно в рамках структуры, но она действительно называется только изнутри конкретного вида. Конкретное представление по-прежнему остается единственным, что известно об ASP.NET Web Forms. Однако эти публичные методы, которые говорят InstantiateIn(System.Web.UI.Control), существуют в моих контрактных сборках, и это подразумевает зависимость от веб-форм ASP.NET.

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

+0

Почему просмотр и презентатор не могут быть осведомлены об элементах управления ASP.NET? –

+0

@ Испытание Кирка? неужели это будет трудно (штопать почти невозможно), чтобы издеваться над этими вещами? –

+0

Не могли бы вы ответить на http://stackoverflow.com/questions/8851933/event-bubbling-and-mvp-asp-net? – Lijo

ответ

0

Один из способов, которым вы можете отделить свой контракт от своего веб-элемента управления, - это отдельный писатель, который обрабатывает информацию из ISomeContract и помещает ее в контейнер Control. Это может находиться в сборке, которая ссылается как на сборку контрактов, так и на System.Web.

+0

Не могли бы вы привести конкретный пример? –

0

Я читал о гибких методах, tdd, модульном тестировании, прочном, шаблонах дизайна и чувствовал себя совершенно бессильным преодолеть разрыв со всей этой замечательной теорией на веб-формы asp.net.

я другой идти на то, чтобы найти решение этой проблемы, ранее сегодня и нашел эту статью:

Это отрывок из книги, которую я считал бы решить все мои проблемы, но эта глава - это просто введение в возможности реализации шаблона MVP в веб-формах, и в заключение он говорит, что это не очень практично. Остальная часть книги посвящена тестированию asp.net MVC, насколько я понял.

Существует также новый проект, который призван принести любовь обратно к платформе WebForms:

0

В «нормальных» веб-формы ASP.NET, ваша страница/управления пользователя технически «отвечает» за обработку и налагает свой жизненный цикл на код. Страница представляет собой презентатор и представление, нравится вам это или нет.

Большинство попыток реализовать шаблон MVP в этой среде просто добавляет излишнюю сложность в слишком сложную среду! Притвориться, что другой класс - это Ведущий, просто ... притворяется. (На веб-сайтах MVC контроллер действительно управляет кодом, а вид не работает, поэтому этот аргумент больше не применяется.)

Моя рекомендация - позволить взгляду следить за своим собственным жизненным циклом и позволить ему вызывать репозитории и классы моделей для извлечения/сохранения данных и вызова команд.

В этом подходе классы Model не должны ничего знать о System.Web. Эти же классы моделей могут затем использоваться в будущих веб-сайтах MVC или Silverlight или в качестве веб-службы для приложений WPF или внедрены в приложение WPF и т. Д. Для определения того, как реализовать (с помощью элементов управления), зависит представление, ответ/данные, которые он получает от Модели.

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

Надеюсь, что это поможет!

2

Не знаете, как посетитель решит проблему. Но почему бы не ваши контрактов выглядеть следующим образом:

public interface ISomeContract 
{ 
    void InstantiateIn(IControl container); 
} 

с реализацией IControl, возможно, в другой сборке, чтобы сохранить вашу контрактную сборку чистыми, что оборачивает над ASP.NET System.Web.Control, как:

public class AspnetControl : IControl 
{ 
    public AspnetControl(System.Web.Control control) { } 

    // IControl members that dispatch to control 
} 

Несмотря на высокую вероятность того, что в конечном итоге IControl окажется очень похож на System.Web.Control (и, следовательно, на поражение точки абстрагирования его в первую очередь), он все равно будет очень проверен, и ваш взгляд и докладчики не должны знать ничего о ASP.NET.

+0

Ваш интерфейс IControl может выставлять определенные события «жизненного цикла», которые может прослушивать ваш контроллер, - большую часть времени, когда вы заканчиваете просто перенос событий в веб-формах (может быть, небольшой вспомогательный класс может облегчить эту боль?), Но если вы хотите, чтобы ваши взгляды быть полностью глупым, тогда вам нужно жить с ним. –