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

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

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

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

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

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

Подумал о нескольких способах, но они мне не нравятся:

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

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

Любая идея?


person Arseni Mourzenko    schedule 13.09.2010    source источник


Ответы (4)


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

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

  1. Класс общей базовой страницы - все страницы наследуются от общей базовой страницы.
  2. Поместите общие функции в класс базовой страницы
  3. С главной страницы на базовую страницу можно перейти путем преобразования - например, myBasePage = (BasePage)this.Page;. Таким образом, главная страница может получить доступ к общим функциям из класса базовой страницы.
person VinayC    schedule 13.09.2010
comment
Ваш подход мне кажется лучшим. Спасибо. - person Arseni Mourzenko; 14.09.2010

Я не считаю ваш второй вариант неприятным.

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

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

person Dan Dumitru    schedule 13.09.2010

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

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

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

bool isDisplayingTips = this.SharedObjects.IsDisplayingTips()
person Andrea Parodi    schedule 13.09.2010

Использовать:

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

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

person eglasius    schedule 13.09.2010