Попытка построить меню из MenuHelperModel
заставляет MvcSiteMap конструировать все мои контроллеры. Это может быть большой успех. Это единственный способ пойти, когда я полагаюсь на [Authorize]
, чтобы настроить безопасность для контроллеров?MvcSiteMap вызывает все мои контроллеры для создания экземпляра
ответ
Прежде всего, constructors should be simple. Если создание ваших контроллеров по каждому запросу замедляет ваше приложение, это признак того, что ваши конструкторы делают слишком много работы. В любом случае среда MVC создает один экземпляр для запроса, поэтому это скорее всего замедляет более чем MvcSiteMapProvider
.
Это еще один вариант. Вы можете использовать свойство role/Roles для установки тех же ролей, что и у AuthorizeAttribute. Недостатками этого являются:
- Вам необходимо продублировать всю схему безопасности.
- Вы не сможете использовать специальный атрибут AuthorizeAttribute.
Возможно, вам удастся обойти первое ограничение, сделав поставщик динамического узла, который сканирует ваше приложение с помощью Reflection и устанавливает роли из AuthorizeAttribute в качестве ролей соответствующего узла. Этот код запускается только один раз за тайм-аут кэша, поэтому наличие некоторого отражения в этой точке, вероятно, не вызовет проблемы с производительностью.
> В любом случае среда MVC создает один экземпляр-конструктор для каждого запроса. Один экземпляр для запроса не такой, как один экземпляр для каждого контроллера на запрос, но я понимаю вашу точку. Первым шагом стал мой конструктор. – Leotsarev
Правда. Но, к сожалению, у Microsoft не было предусмотрительности для тех, кто хочет использовать «AuthorizeAttribute» для проверки безопасности на что-либо, что не является * текущим запросом, - вам остается без выбора, кроме как для макета объекта 'ControllerContext', который представляет запрос * будет *, который требует экземпляра контроллера (или дублирует всю схему безопасности, как я упоминал). – NightOwl888