Как настроить несколько карт сайта с помощью MVCsiteMapProvider v4 со StructureMap DI

Проблема, по сути, в том, что я не могу заставить свою конфигурацию карты сайта поддерживать несколько карт сайта. Он всегда ищет «по умолчанию», даже когда я называю свои экземпляры и запрашиваю другой. Теперь о фоне.

Я изучил документы для новой реализации MVCsiteMapProvider. Теперь они используют внедрение зависимостей для настройки SiteMapProvider. У нас есть существующая реализация StructureMap DI, поэтому я следовал инструкциям и добавил, в нашем случае

ObjectFactory.Configure(x =>
{
...
x.AddRegistry<MvcSiteMapProviderRegistry>();
...
});

Затем я начал настраивать файл MvcSiteMapProviderRegistry.cs, чтобы реализовать мой сценарий с несколькими картами сайта. У меня есть несколько файлов карты сайта, любой из них будет работать, если он называется «по умолчанию». Если я удаляю элемент «по умолчанию», он ломается и жалуется, что «по умолчанию» отсутствует. Я предполагаю, что это потому, что он не может найти мой экземпляр. Вот как я их определил. Я подозреваю, что проблема где-то здесь... загрузчик, который, как он говорит, я должен настроить в Global.asax, ищет ISiteMapLoader, но я добавляю свою множественную конфигурацию в SiteMapBuilderSet... в любом случае, вот код.

// Register the sitemap builder
        string absoluteFileName = HostingEnvironment.MapPath("~/Main.sitemap");
        string absoluteFileName2 = HostingEnvironment.MapPath("~/Test.sitemap");


            var xmlSource = this.For<IXmlSource>().Use<FileXmlSource>()
                       .Ctor<string>("fileName").Is(absoluteFileName);

        var reservedAttributeNameProvider = this.For<ISiteMapXmlReservedAttributeNameProvider>()
            .Use<SiteMapXmlReservedAttributeNameProvider>()
            .Ctor<IEnumerable<string>>("attributesToIgnore").Is(new string[0]);

        var builder = this.For<ISiteMapBuilder>().Use<CompositeSiteMapBuilder>()
            .EnumerableOf<ISiteMapBuilder>().Contains(y =>
            {
                y.Type<XmlSiteMapBuilder>()
                    .Ctor<ISiteMapXmlReservedAttributeNameProvider>().Is(reservedAttributeNameProvider)
                    .Ctor<IXmlSource>().Is(xmlSource);
                y.Type<ReflectionSiteMapBuilder>()
                    .Ctor<IEnumerable<string>>("includeAssemblies").Is(includeAssembliesForScan)
                    .Ctor<IEnumerable<string>>("excludeAssemblies").Is(new string[0]);
                y.Type<VisitingSiteMapBuilder>();
            });

        var xmlSource2 = this.For<IXmlSource>().Use<FileXmlSource>()
                       .Ctor<string>("fileName").Is(absoluteFileName2);

        var builder2 = this.For<ISiteMapBuilder>().Use<CompositeSiteMapBuilder>()
            .EnumerableOf<ISiteMapBuilder>().Contains(y =>
            {
                y.Type<XmlSiteMapBuilder>()
                    .Ctor<ISiteMapXmlReservedAttributeNameProvider>().Is(reservedAttributeNameProvider)
                    .Ctor<IXmlSource>().Is(xmlSource2);
                y.Type<ReflectionSiteMapBuilder>()
                    .Ctor<IEnumerable<string>>("includeAssemblies").Is(includeAssembliesForScan)
                    .Ctor<IEnumerable<string>>("excludeAssemblies").Is(new string[0]);
                y.Type<VisitingSiteMapBuilder>();
            });

// Configure the builder sets
        this.For<ISiteMapBuilderSetStrategy>().Use<SiteMapBuilderSetStrategy>()
            .EnumerableOf<ISiteMapBuilderSet>().Contains(x =>
            {
/*                    x.Type<SiteMapBuilderSet>()
                    .Ctor<string>("instanceName").Is("default")
                    .Ctor<bool>("securityTrimmingEnabled").Is(securityTrimmingEnabled)
                    .Ctor<bool>("enableLocalization").Is(enableLocalization)
                    .Ctor<ISiteMapBuilder>().Is(builder)
                    .Ctor<ICacheDetails>().Is(cacheDetails);*/
/*
                x.Type<SiteMapBuilderSet>()
                    .Ctor<string>("instanceName").Is("MainSiteMapProvider")
                    .Ctor<bool>("securityTrimmingEnabled").Is(securityTrimmingEnabled)
                    .Ctor<bool>("enableLocalization").Is(enableLocalization)
                    .Ctor<ISiteMapBuilder>().Is(builder)
                    .Ctor<ICacheDetails>().Is(cacheDetails);*/


                x.Type<SiteMapBuilderSet>()
                    .Ctor<string>("instanceName").Is("TestSiteMapProvider")
                    .Ctor<bool>("securityTrimmingEnabled").Is(securityTrimmingEnabled)
                    .Ctor<bool>("enableLocalization").Is(enableLocalization)
                    .Ctor<ISiteMapBuilder>().Is(builder2)
                    .Ctor<ICacheDetails>().Is(cacheDetails);
            });

В моем global.asax.cs я добавил

MvcSiteMapProvider.SiteMaps.Loader = Resolver.Get<ISiteMapLoader>();

и для ссылки на мой взгляд у меня есть

 @Html.MvcSiteMap("TestSiteMapProvider").Menu(false, true, true)

но он не должен быть в состоянии найти «TestSiteMapProvider», потому что он всегда отображает «по умолчанию» или жалуется, если он не существует.

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


person John W.    schedule 31.07.2013    source источник


Ответы (1)


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

См. этот документ (который не назывался так, когда я начинал). https://github.com/maartenba/MvcSiteMapProvider/wiki/Несколько файлов Sitemap в одном приложении

person John W.    schedule 02.08.2013