Как настроить несколько файлов Sitemap, используя MVCSiteMapProvider v4 с StructureMap DI

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

Я пролил документы на новую реализацию MVCSiteMapProvider. Теперь они используют Dependency Injection для настройки 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", потому что он всегда отображает "по умолчанию" или жалуется, если он не существует.

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

1 ответ

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

Смотрите этот документ (который я не назвал, когда я начал.) https://github.com/maartenba/MvcSiteMapProvider/wiki/Multiple-Sitemaps-in-One-Application

Другие вопросы по тегам