Как настроить несколько файлов 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