Asp.net mvc 4 如何使用带有StructureMap DI的MVCSiteMapProvider v4配置多个站点地图

Asp.net mvc 4 如何使用带有StructureMap DI的MVCSiteMapProvider v4配置多个站点地图,asp.net-mvc-4,dependency-injection,sitemap,mvcsitemapprovider,Asp.net Mvc 4,Dependency Injection,Sitemap,Mvcsitemapprovider,本质上,问题是我无法让我的站点地图配置支持多个站点地图。它总是在寻找“默认值”,即使当我命名我的实例并请求另一个实例时也是如此。现在是背景 我一直在为MVCSiteMapProvider的新实现倾注大量的文档。他们现在使用依赖项注入来配置SiteMapProvider。我们有一个现有的StructureMap DI实现,所以我按照说明添加了 ObjectFactory.Configure(x => { ... x.AddRegistry<MvcSiteMapProviderRegis

本质上,问题是我无法让我的站点地图配置支持多个站点地图。它总是在寻找“默认值”,即使当我命名我的实例并请求另一个实例时也是如此。现在是背景

我一直在为MVCSiteMapProvider的新实现倾注大量的文档。他们现在使用依赖项注入来配置SiteMapProvider。我们有一个现有的StructureMap DI实现,所以我按照说明添加了

ObjectFactory.Configure(x =>
{
...
x.AddRegistry<MvcSiteMapProviderRegistry>();
...
});
但它一定不能找到“TestSiteMapProvider”,因为它总是显示“default”,如果它不存在,则会抱怨


我还认为这可能与缓存有关,因为我看到这里引用的文件名,但我不知道如何向缓存中添加多个实例,所以我只是禁用了它。无论如何,我真的没有对我的网站地图做任何花哨的事情,而这整件事真的感觉像是为了得到一些自动面包屑而大肆渲染

显然还有另一个我不知道的帮助医生。到目前为止,我已经正确地完成了所有步骤,但我还需要实现ISitemApacheKeyGenerator

查看此文档(我开始时未将其命名为此。)

// 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);
            });
MvcSiteMapProvider.SiteMaps.Loader = Resolver.Get<ISiteMapLoader>();
 @Html.MvcSiteMap("TestSiteMapProvider").Menu(false, true, true)