2016-09-06 5 views
0

У меня есть приложение 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, и мне не повезло создать упомянутый метод. Мы ценим любые предложения. Заранее спасибо.

+0

«У меня около дюжины файлов Sitemap». Похоже, это может быть излишним. Обычно есть более эффективные варианты, чем создание нескольких SiteMaps. Если у вас нет нескольких арендаторов или у вас есть какая-то другая необходимость держать их в отдельности, рекомендуется использовать все узлы, которые вам нужны, в одну и ту же SiteMap и использовать обрезку безопасности, средства просмотра видимости, настраиваемые HTML-вспомогательные шаблоны и/или пользовательский HTML-код помощники для контроля того, какие узлы отображаются. – NightOwl888

+0

Отмечено. Это очень хорошо может быть излишним, но это часть ландшафта, с которым я должен работать, тем не менее. –

ответ

0

Я считаю, что нашел решение. Вместо того, чтобы обрабатывать все, я создал метод, который создал SiteMapBuilder, и добавил его в коллекцию.

Я назвал этот метод дюжиной или около того для всех моих файлов Sitemap, а затем зациклился на коллекции в рамках инъекции SiteMapBuilderSetStrategy.

Кажется, что это работает - хотя, если есть более эффективные подходы, не стесняйтесь комментировать.

 Смежные вопросы

  • Нет связанных вопросов^_^