Как разделить код между страницами и мастер-страницами без множественного наследования / дублирования кода? - PullRequest
1 голос
/ 13 сентября 2010

Я прочитал вопросы / ответы , объясняющие, что в нет множественного наследования в C # , что оно нам даже не нужно и что оно вызывает слишком много проблем.

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

Вот ситуация. Существует веб-сайт с домашней страницей и другими страницами, унаследованными от главной страницы (домашняя страница не наследуется от). И на странице, и на главной странице выполняются некоторые действия: настраиваемый вход в систему, статистика, загрузка пользовательских настроек для настройки и т. Д. На данный момент решение является дрянным, поскольку исходный код для этих задач просто копируется дважды .

Класс домашней страницы наследуется от Page. С другой стороны, главная страница наследуется от Masterpage. Логично, что было бы здорово наследовать и от общего класса, но это множественное наследование, поэтому это невозможно.

Так что же делать вместо этого?

Я думал о нескольких способах, но не любил их:

  • Создайте автономный класс, который будет вызываться из класса страницы / мастер-страницы . Например, вместо того, чтобы писать bool isDisplayingTips = this.CurrentUser.IsDisplayingTips, я бы написал bool isDisplayingTips = this.SharedObjects.CurrentUser.IsDisplayingTips. Мне это не нравится, так как писать больше.

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

Есть идеи?

Ответы [ 4 ]

8 голосов
/ 13 сентября 2010

MasterPage - это просто элемент управления (который встроен в реальную страницу), поэтому вы не сможете использовать более поздний подход. Однако первый подход к созданию другого вспомогательного класса вполне осуществим.

Еще один подход, который мы обычно используем, - это

  1. Общий класс базовой страницы - все страницы будут наследоваться от общей базовой страницы.
  2. Поместите общую функциональность в базовый класс страниц
  3. На главной странице можно ссылаться на базовую страницу путем приведения - например, myBasePage = (BasePage)this.Page;. Таким образом, главная страница может получить доступ к общим функциям из класса базовой страницы.
1 голос
/ 14 сентября 2010

Использование:

автономный класс, который будет вызываться из класса страницы / мастер-страницы

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

1 голос
/ 13 сентября 2010

Я предлагаю вам использовать первый вариант.Если вы (по понятным причинам) не чувствуете себя комфортно с повышенным уровнем косвенности, вы можете просто создать новые методы в своем автономном классе, например:

public bool IsDisplayingTips(){
    return CurrentUser.IsDisplayingTips;
}

, а из ваших страниц просто позвоните

bool isDisplayingTips = this.SharedObjects.IsDisplayingTips()
1 голос
/ 13 сентября 2010

Мне не нравится ваш второй вариант.

Полагаю, вы имеете в виду создание базового класса, например, MasterPageBase, полученный из System.Web.UI.MasterPage и создающий пустую мастер-страницу для вашей домашней страницы, которая будет наследоваться от этого MasterPageBase.

Если все сделано правильно, это не должно замедлять ход событий ...

...