2016-09-06 1 views
0

J'ai une application MVC pour laquelle j'utilise MvcSiteMapProvider pour afficher les fils d'Ariane. J'ai lu https://github.com/maartenba/MvcSiteMapProvider/wiki/Multiple-Sitemaps-in-One-Application et obtenu plusieurs sitemaps pour fonctionner correctement dans mon application. J'utilise StructureMap comme conteneur DI pour MvcSiteMapProvider.MvcSiteMapProvider - enregistrement du groupe de création à l'aide de structuremap déplacé vers une méthode séparée?

Dans l'exemple ci-dessus, deux instances de classe SiteMapBuilder sont créées manuellement, puis elles sont toutes deux injectées dans le constructeur SiteMapBuilderSetStrategy.

J'ai environ une douzaine de sitemaps en cours d'utilisation. Ce nombre mon changement dans le futur. Afin de minimiser la maintenance impliquée, je voudrais créer un appel de méthode qui gérera correctement l'injection d'une instance SiteMapBuilder dans le constructeur SiteMapBuilderSetStrategy.

donc je voudrais aller de quelque chose comme ça

//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) 
        ; 
      }); 

à quelque chose comme ça, que je serais en mesure d'appeler du constructeur du Registre. Je ne suis pas familier avec StructureMap, et je n'ai pas beaucoup de chance de créer cette méthode. Toute suggestion serait appréciée. Merci d'avance.

+0

"J'ai environ une douzaine de sitemaps en cours d'utilisation." On dirait que ça pourrait être exagéré. Il existe généralement des options plus performantes que la création de plusieurs SiteMaps. À moins que vous ayez plusieurs locataires ou que vous ayez besoin de les séparer, la méthode recommandée consiste à charger tous les nœuds dont vous avez besoin dans le même SiteMap et à utiliser les paramètres de sécurité, les fournisseurs de visibilité, les modèles HTML personnalisés et/ou HTML personnalisé. helpers pour contrôler quels noeuds sont affichés. – NightOwl888

+0

Noté. C'est très bien peut-être exagéré, mais fait partie du paysage avec lequel je dois quand même travailler. –

Répondre

0

Je crois avoir trouvé une solution. Au lieu de tout paramétrer, j'ai créé une méthode qui a créé SiteMapBuilder et l'ai ajoutée à une collection.

J'ai appelé cette méthode une douzaine de fois pour tous mes sitemaps, puis j'ai bouclé la collection dans l'injection SiteMapBuilderSetStrategy.

Cela semble fonctionner - mais s'il existe de meilleures approches, n'hésitez pas à commenter.