У меня есть приложение MVC, для которого я использую MvcSiteMapProvider для отображения панировочных сухарей. Я прочитал https://github.com/maartenba/MvcSiteMapProvider/wiki/Multiple-Sitemaps-in-One-Application и получил несколько файлов Sitemap для правильной работы в своем приложении. Я использую StructureMap в качестве контейнера DI для MvcSiteMapProvider.MvcSiteMapProvider - регистрация встроенного устройства с использованием структуры структуры переместилась в отдельный метод?
В приведенном выше примере два экземпляра класса SiteMapBuilder создаются вручную, а затем они оба вставляются в конструктор SiteMapBuilderSetStrategy вместе.
У меня около дюжины файлов Sitemap для использования. Это число мое изменение в будущем. Чтобы свести к минимуму поддерживаемое обслуживание, я хотел бы создать вызов метода, который будет обрабатывать правильное вложение экземпляра SiteMapBuilder в конструктор SiteMapBuilderSetStrategy.
, так что я хотел бы перейти от чего-то вроде этого
//instance 1
var source1 = this.For<IXmlSource>()
.Use<FileXmlSource>()
.Ctor<string>"fileName").Is([filepath to sitemap file]));
var provider1 = this.For<ISiteMapNodeProvider>()
.Use<XmlSiteMapNodeProvider>()
.Ctor<bool>("includeRootNode").Is(true)
.Ctor<bool>("useNestedDynamicNodeRecursion").Is(false)
.Ctor<IXmlSource>().Is(source1);
var builder1 = this.For<ISiteMapBuilder>()
.Use<SiteMapBuilder>()
.Ctor<ISiteMapNodeProvider>().Is(provider1);
//instance 2
var source2 = this.For<IXmlSource>()
.Use<FileXmlSource>()
.Ctor<string>("fileName").Is([filepath to sitemap file]));
var provider2 = this.For<ISiteMapNodeProvider>()
.Use<XmlSiteMapNodeProvider>()
.Ctor<bool>("includeRootNode").Is(true)
.Ctor<bool>("useNestedDynamicNodeRecursion").Is(false)
.Ctor<IXmlSource>().Is(source2);
var builder1 = this.For<ISiteMapBuilder>()
.Use<SiteMapBuilder>()
.Ctor<ISiteMapNodeProvider>().Is(provider2);
//inject
this.For<ISiteMapBuilderSetStrategy>()
.Use<SiteMapBuilderSetStrategy>()
.EnumerableOf<ISiteMapBuilderSet>()
.Contains(x =>
{
x.Type<SiteMapBuilderSet>()
.Ctor<string>("instanceName").Is("instance 1")
.Ctor<bool>("securityTrimmingEnabled").Is(true)
.Ctor<bool>("enableLocalization").Is(false)
.Ctor<ISiteMapBuilder>().Is(builder1)
;
x.Type<SiteMapBuilderSet>()
.Ctor<string>("instanceName").Is("instance 2")
.Ctor<bool>("securityTrimmingEnabled").Is(true)
.Ctor<bool>("enableLocalization").Is(false)
.Ctor<ISiteMapBuilder>().Is(builder2)
;
});
к чему-то вроде этого, что я мог бы вызвать из конструктора реестра.
methodized(string filePath, string instanceName)
{
var source = this.For<IXmlSource>().Add<FileXmlSource>()
.Ctor<string>("fileName").Is(filePath);
var provider = this.For<ISiteMapNodeProvider>()
.Add<XmlSiteMapNodeProvider>()
.Ctor<bool>("includeRootNode").Is(true)
.Ctor<bool>("useNestedDynamicNodeRecursion").Is(false)
.Ctor<IXmlSource>().Is(source);
var builder = this.For<ISiteMapBuilder>().Add<SiteMapBuilder>()
.Ctor<ISiteMapNodeProvider>().Is(provider);
this.For<ISiteMapBuilderSetStrategy>().Add<SiteMapBuilderSetStrategy>()
.EnumerableOf<ISiteMapBuilderSet>().Contains(x =>
{
x.Type<SiteMapBuilderSet>()
.Ctor<string>("instanceName").Is(instanceName)
.Ctor<bool>("securityTrimmingEnabled").Is(true)
.Ctor<bool>("enableLocalization").Is(false)
.Ctor<ISiteMapBuilder>().Is(builder)
;
});
}
Я не знаком с StructureMap, и мне не повезло создать упомянутый метод. Мы ценим любые предложения. Заранее спасибо.
«У меня около дюжины файлов Sitemap». Похоже, это может быть излишним. Обычно есть более эффективные варианты, чем создание нескольких SiteMaps. Если у вас нет нескольких арендаторов или у вас есть какая-то другая необходимость держать их в отдельности, рекомендуется использовать все узлы, которые вам нужны, в одну и ту же SiteMap и использовать обрезку безопасности, средства просмотра видимости, настраиваемые HTML-вспомогательные шаблоны и/или пользовательский HTML-код помощники для контроля того, какие узлы отображаются. – NightOwl888
Отмечено. Это очень хорошо может быть излишним, но это часть ландшафта, с которым я должен работать, тем не менее. –