Я делаю реализацию Wicked Code для SqlSiteMapProvider, кроме VB.NET.
В коде есть несколько вещей, которые вызывают проблемы, и я не понимаю, как это должно работать так, как написано в статье. Я предоставил код прямо из статьи, представленной ниже. Я вставил сюда код для удобства просмотра
Первая проблема - создается экземпляр зависимости ДО (строки 134-137), когда создается дерево (151-160) - поэтому, как только вы добавите зависимость в http.cache (165-167), событие OnSiteMapChanged ( 242) Немедленно запускается - снова запускается весь процесс - и это повторяется много раз, пока, наконец, что-то не останавливает его. (я прошел через него и посчитал зацикливание кода как минимум 20 раз, прежде чем перестал пытаться угадать, когда он попадет в последний раз)
ОК, поэтому, чтобы исправить это, я просто переместил код для создания зависимости ПОСЛЕ того, как построено дерево, прямо перед вставкой в http.cache (поэтому свойство HasChanged имеет значение false при добавлении в http.cache, и вы не застрять в этой псевдо-ифинитной петле).
У меня все еще есть проблема - каждый раз, когда страница загружается, BuildSiteMap () нажимает и строка 121 проверяет, является ли _root не нулевым - кажется, что оно никогда не будет нулевым после его первой сборки ... это хорошо, потому что я не хочу бить в БД каждый раз. Теперь я вставляю запись в таблицу ... событие OnSiteMapChanged никогда не срабатывает. Когда я просматриваю страницы в приложении, карта сайта не отражает вновь вставленную запись - пошагово просматривая код, я вижу, что проверка в строке 121 все еще вызывает замыкание функции ... Карта сайта будет обновляться только в том случае, если я -старт Visual Studio, который приводит к тому, что личное поле _root снова становится нулевым, и перестраивает карту сайта, отражая новые изменения .. (обновление браузера или запуск новых экземпляров браузера не работает) ...
РЕДАКТИРОВАТЬ: ПРОБЛЕМА, ВЫСТУПЛЕННАЯ ИЗ ГРОМКОЙ «НАСТРОЙКИ» НА ЛИНИИ В ТОПЕ МОЕГО ХРАНЕННОГО ПРОЦЕССА. ВНЕШНИЙ ВИД ЭТОГО РАЗРЫВАЕТ УВЕДОМЛЕНИЕ О ЗАПРОСЕ. Кажется, что этот оператор рассматривается как набор результатов, и что второй фактический оператор запроса делает недействительным набор результатов, что приводит к уведомлению. Это было очень трудно найти и нигде в документации MSDN, пока я не добавил комментарий. Надеюсь, это спасет кого-то еще от скряги, через которую я прошел!