По какой-то причине в MVC нет эквивалента 1: 1, давайте просто повторим, как думать об этом в MVC:
Модель : "Страницы этого сайта всегда запрашиваются в определенном контексте, назовем его арендатором (или пользователем, темой или чем-либо еще, что представляют ваши поддомены). Модель домена имеет свойство, представляющее арендатор текущего запроса. "
Просмотр : «Визуализация заголовка страницы в зависимости от клиента, установленного в модели.»
Контроллер : «Установить владельца в модели в зависимости от заголовка узла».
Имейте в виду, что мы хотим избежать смешивания контроллера, представления и бизнес-логики. Наличие логики контроллера в более чем одном месте или месте, которое не называется «контроллером», не является проблемой, если оно остается разделенным.
А теперь хорошая вещь: Вы можете сделать этот "стиль MVC" даже с веб-формами , и решение по-прежнему работает с ASP.NET MVC!
У вас все еще есть жизненный цикл запроса (не жизненный цикл страницы), поэтому вы можете реализовать собственный HttpModule, который содержит эту часть логики контроллера для всех запросов. Он обрабатывает событие BeginRequest, проверяет заголовок узла и сохраняет владельца в чем-то вроде HttpContext.Current.Items ["tenant"]. (Конечно, вы могли бы иметь статическую, типизированную оболочку для этой словарной статьи.)
Тогда все ваши объекты модели (или базовый класс модели, или все, что подходит для вашего решения) могут получить доступ к HttpContext, чтобы обеспечить доступ к этой информации, например так:
public string Tenant
{
get { return HttpContext.Current.Items["tenant"]; }
}
Преимущества:
- Вы разделили причину (заголовок хоста) и следствие (отображение заголовка страницы), улучшая удобство сопровождения и тестируемость
- Поэтому вы можете легко добавить дополнительное поведение в модель вашего домена на основе этого состояния, например, загрузку содержимого из базы данных в зависимости от текущего арендатора.
- Вы можете легко сделать так, чтобы большее количество частей представления зависело от арендатора, например, от CSS-файла, логотипа и т. Д.
- Позже вы можете изменить логику контроллера, чтобы установить арендатора в модели не только на основе поддоменов, но, возможно, на основе файла cookie, реферера, термина поиска, языка пользовательского агента или того, о чем вы можете думать, без изменение любого вашего кода в зависимости от модели.
Обновление для редактирования : мне не нравится идея сохранения состояния в сеансе, особенно если ваш файл cookie сеанса может применяться не только к каждому поддомену, но и ко всем доменам. В этом случае вы можете показывать несогласованный контент, если ранее пользователи просматривали другой поддомен. Вероятно, информация в базе данных, которая сопоставляет заголовки хоста с арендаторами, будет меняться не очень часто, поэтому вы можете ее кэшировать и вам не нужен поиск в базе данных для каждого запроса.