2016-09-06 8 views
0

私はパンくずリストを表示するためにMvcSiteMapProviderを使用しているMVCアプリケーションを持っています。私はhttps://github.com/maartenba/MvcSiteMapProvider/wiki/Multiple-Sitemaps-in-One-Applicationを読んで、私のアプリケーションで正しく動作するように複数のサイトマップを取得しました。 MvcSiteMapProviderのDIコンテナとしてStructureMapを使用しています。MvcSiteMapProvider - 構造マップを使用したビルダーセット登録が別のメソッドに移動しましたか?

上記の例では、2つのSiteMapBuilderクラスインスタンスを手動で作成してから、それらをともにSiteMapBuilderSetStrategyコンストラクタに挿入します。

私は約12のサイトマップを使用しています。これは私の将来の変化です。関係するメンテナンスを最小限に抑えるために、SiteMapBuilderSetStrategyコンストラクタにSiteMapBuilderインスタンスを正しく挿入するメソッド呼び出しを作成したいと思います。

ので、私はレジストリのコンストラクタから呼び出すことができるだろうと、このような何かにこの

//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

「私は約12のサイトマップを使用しています。それは過度のことかもしれないような音。通常、複数のサイトマップを作成するよりも優れた選択肢があります。テナントが複数存在する場合や、別々に保管する必要がない場合は、必要なノードをすべて同じサイトマップにロードし、セキュリティトリミング、可視性プロバイダ、カスタムHTMLヘルパーテンプレート、および/またはカスタムHTMLを使用することをお勧めしますヘルパーはどのノードが表示されるかを制御します。 – NightOwl888

+0

注目。それは非常にうまくいくかもしれませんが、それでも私が働かなければならない風景の一部です。 –

答えて

0

私は解決策を見つけたと信じています。すべてをメソッド化するのではなく、SiteMapBuilderを作成してコレクションに追加するメソッドを作成しました。

私はこのメソッドをすべてのサイトマップに対して十数回呼び出してから、SiteMapBuilderSetStrategyインジェクション内のコレクションをループしました。

これはうまくいくようですが、より良いアプローチがあればお気軽にコメントしてください。

関連する問題