динамическая маршрутизация на основе записей базы данных - PullRequest
2 голосов
/ 06 марта 2012

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

У нас есть приложение, которое предоставляет услуги членам различных организаций, которые являются частью более крупного родителя. Организации требуют пользовательских URL-адресов. Таким образом, члены организации A получают доступ к URL https://server/vdir/OrgA, а члены организации B получают доступ к URL https://server/vdir/OrgB.

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

Поскольку список организаций, использующих это приложение, является динамическим, и поскольку не все организации начнут использовать его одновременно, я начал программно настраивать сопоставление маршрутов. В целевой области я переопределяю метод RegisterArea, извлекаю активные организации из базы данных и выполняю собственный вызов context.MapRoute для каждого.

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

И это работает, приятно. Но: все это выполняется в Application_Start. Если мы добавим организацию, она не станет активной до тех пор, пока мы не перезапустим приложение, что будет очень вредным для любого, кто использовал его в то время.

Итак, у меня два вопроса:

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

1 Ответ

2 голосов
/ 06 марта 2012

Фил Хаак написал статью , посвященную именно этой проблеме .

Действительно, очень короткая версия заключается в том, что вы помещаете свои регистрации маршрутов в файл, отличный от Global.asax, и кэшируете содержимое этого файла.Кэш имеет файл как зависимость и вызывает метод, когда кеш становится недействительным (читай: файл изменен), который перерегистрирует ваши маршруты.

...