0

В _Layout.cshtml меню @ Html.MvcSiteMap(). («Viewname») вызвало дополнительные 2 с в каждом запросе. Я обнаружил, что конструктор репозитория, выполняемый несколько раз, зависит от подсчета меню, поэтому я предполагаю, что это может быть где-то еще 2 секунды.Как предотвратить конструктор контроллера, сервиса и хранилища, выполненный с помощью html-помощника поставщика mvc sitemap?

Есть ли способ предотвратить выполнение конструкторов после отображения меню?

ответ

0

Я подозреваю, причина в том, что вы используете Security Trimming. Чтобы определить, имеет ли каждая ссылка доступ, MVCSiteMapProvider создает и освобождает экземпляр каждого контроллера для каждого действия. Единственный способ избежать этого - отключить обрезку безопасности.

С включенной обрезкой безопасности не рекомендуется иметь какую-либо тяжелую обработку внутри ваших конструкторов, так как это отрицательно скажется на производительности. Вы должны отложить любую обработку (например, открытие соединений с базой данных), чтобы позже в жизненном цикле запроса, используя Abstract Factory, чтобы создать соединение и впрыснуть завод в свой конструктор вместо объекта dbcontext/connection. См. Пример this post.

Это говорит о том, что AuthorizeAttributeAclModule не так эффективен, как могло бы быть, потому что, когда у вас есть контроллеры с множеством методов действий, один и тот же экземпляр контроллера можно было бы повторно использовать, а не создавать для каждого метода действий. Вы можете сделать обычай AuthorizeAttributeAclModule и использовать словарь HttpContext.Items для запроса-кеширования каждого контроллера, чтобы они повторно использовались, а не повторно инициализировались. Однако вам нужно будет сделать рефакторинг. Контроллер создан на line 235, и он выпущен на line 108. Вы должны убедиться, что релиз не вызывается до тех пор, пока не будет проверен последний последний узел. Вы можете сделать это, создав IActionFilter, чтобы освободить их после завершения действия, но это означает, что метод действия должен знать о том же кеше запросов (в HttpContext.Items) как AuthorizeAttributeAclModule. Вам просто нужно реализовать метод OnActionExecuted для очистки контроллеров от кеша запросов.

+0

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