1

Попытка построить меню из MenuHelperModel заставляет MvcSiteMap конструировать все мои контроллеры. Это может быть большой успех. Это единственный способ пойти, когда я полагаюсь на [Authorize], чтобы настроить безопасность для контроллеров?MvcSiteMap вызывает все мои контроллеры для создания экземпляра

ответ

2

Прежде всего, constructors should be simple. Если создание ваших контроллеров по каждому запросу замедляет ваше приложение, это признак того, что ваши конструкторы делают слишком много работы. В любом случае среда MVC создает один экземпляр для запроса, поэтому это скорее всего замедляет более чем MvcSiteMapProvider.

Это еще один вариант. Вы можете использовать свойство role/Roles для установки тех же ролей, что и у AuthorizeAttribute. Недостатками этого являются:

  1. Вам необходимо продублировать всю схему безопасности.
  2. Вы не сможете использовать специальный атрибут AuthorizeAttribute.

Возможно, вам удастся обойти первое ограничение, сделав поставщик динамического узла, который сканирует ваше приложение с помощью Reflection и устанавливает роли из AuthorizeAttribute в качестве ролей соответствующего узла. Этот код запускается только один раз за тайм-аут кэша, поэтому наличие некоторого отражения в этой точке, вероятно, не вызовет проблемы с производительностью.

+1

> В любом случае среда MVC создает один экземпляр-конструктор для каждого запроса. Один экземпляр для запроса не такой, как один экземпляр для каждого контроллера на запрос, но я понимаю вашу точку. Первым шагом стал мой конструктор. – Leotsarev

+1

Правда. Но, к сожалению, у Microsoft не было предусмотрительности для тех, кто хочет использовать «AuthorizeAttribute» для проверки безопасности на что-либо, что не является * текущим запросом, - вам остается без выбора, кроме как для макета объекта 'ControllerContext', который представляет запрос * будет *, который требует экземпляра контроллера (или дублирует всю схему безопасности, как я упоминал). – NightOwl888