2009-07-13 2 views
0

В моем проекте используется базовая страница для хранения общих функций страницы. Он работал до тех пор, пока базовая страница не стала огромной, поэтому я попытался разбить базовую страницу на несколько классов. Тогда я понял, что я не могу писатьКак имитировать множественное наследование для базовых страниц ASP.NET?

public MyPage : SecurePage, PageWithGridViewSorting, PageWithSessionWarning 

дал что-то вроде:

public class SecurePage : RadAjaxPage 
{ 
    // Add session id to ViewStateUserKey 
} 

public class PageWithGridViewSorting : RadAjaxPage 
{ 
    // add sorting to all grids on page 
} 

public class PageWithSessionWarning : RadAjaxPage 
{ 
    // inject javascript to warn user of impending session end 
} 

Какой путь я должен принять это? И я думаю, что тот факт, что это страница ASP.NET, уместен, потому что это класс, который создается структурой, а не мной. Моя первая мысль заключалась в том, чтобы сделать переопределение для конструктора и передать функции и не работать с System.Web.UI.Page.

+0

Есть ли какие-либо из этих функциональных возможностей, которые вы могли бы назвать из других классов? Если это так, вы просто создаете экземпляры соответствующих объектов или делаете их статическими классами и вызываете их так. – Powerlord

+0

@RBembros Обычно этот код подключается к Page_Load, OnInit и т. Д., Поэтому он представляет собой конвейер ASP.NET, который вызывает код, через события и жизненный цикл страницы. Точка хорошо взята для статических методов, я согласен, что они не должны быть в базовом классе. – MatthewMartin

ответ

4

ли функции, предоставляемые SecurePage, PageWithGridViewSorting и PageWithSessionWarning фактически должны быть перегружены или переопределить их производных классов?

Если все, что вы делаете, использует наследование для групповых функций, вам следует рассмотреть возможность использования другого метода организации функций в классах. Например, Strategy pattern. Страница со сортировкой - это страница с сортировкой. Это страница, в которой имеет сортировку. Использование наследования - это неправильный способ решения этой проблемы.

Если они do должны отличаться в производных классах, возможно, вы захотите подойти к проблеме с интерфейсами вместо наследования. Так как вы все равно будете переопределять функции, это не должно увеличивать сложность или заставлять вас повторять.

EDIT: Учитывая специфику вашей проблемы, это действительно звучит для меня, как вы должны исследовать aspect-oriented programming и как вы можете fit it into your language.

3

Я бы попытался переместить часть содержимого из BasePage в UserControls. Скажем, PageWithSessionWarning. Это может быть контроль, который вы используете на главной странице.

2

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

Это может быть сложной задачей в ASP.NET, потому что жизненный цикл страницы является сложным и может часто «мешать» при попытке написать общий код.

Вы также можете попытаться переместить функциональность в пользовательские или пользовательские элементы управления, если функциональность ориентирована на пользовательский интерфейс.

Кроме того, мастер-страницы являются эффективным способом факторинга общей функциональности страницы и

Смежные вопросы