如何使用带有StructureMap DI的MVCSiteMapProvider v4配置多个站点地图

时间:2013-07-31 16:53:13

标签: asp.net-mvc-4 dependency-injection sitemap mvcsitemapprovider

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

我一直在为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”,因为它始终显示“default”或抱怨(如果它不存在)。

我还认为它可能与Cache有关,因为我看到那里引用的文件名,但我不知道如何将多个实例添加到缓存中,所以我只是禁用它。无论如何,我真的没有对我的站点地图做任何想象,而且整个过程真的感觉就像是为了获得一些自动面包屑而感到非常大的过度杀伤!

1 个答案:

答案 0 :(得分:0)

显然还有另一个我不知道的帮助文档。到目前为止,我已经完成了所有步骤,但我还需要实现ISiteMapCacheKeyGenerator。

请参阅此文档(我开始时没有将其命名为。) https://github.com/maartenba/MvcSiteMapProvider/wiki/Multiple-Sitemaps-in-One-Application