2010-09-24 15 views
3

Vous rencontrez un problème avec StructureMap IOC. Je souhaite récupérer différentes implémentations concrètes d'objets implémentant la même interface en fonction d'étiquettes ou de noms.StructureMap IOC instances nommées aider

internal static class InstanceHelper 
{ 

    internal enum Taxonomy 
    { 
     Foo, 
     Bar 
    } 

    static InstanceHelper() 
    { 
      // Initialize the container 
      ObjectFactory.Initialize(x => 
      { 
       x.For<IMyInterface>().Use<ObjectA>().Named(Taxonomy.Foo.ToString()); 
       x.For<IMyInterface>().Use<ObjectB>().Named(Taxonomy.Bar.ToString()); 
      }); 

    } 

    internal static IMyInterface GetInstanceByTaxonomy(Taxonomy taxonomy) 
    { 

      // this raises an exception 
      ObjectFactory.GetNamedInstance<IMyInterface>(taxonomy.ToString()); 

    } 
} 

La documentation est de ne pas bon à cet égard, semble que tous les exemples là-bas sont déconseillés ... en utilisant la version 2.6.1.0

merci.

+2

Modifier vos appels à Use() à Add() –

Répondre

0

La manière originale et le chemin d'amarsuperstar semblent fonctionner réellement, le problème était que la portée de la classe 'ObjectA' avait été déclarée comme interne, avec un constructeur interne. J'ai changé cela en Public et maintenant IOC peut le voir ... la réflexion inverse se produit dans l'ensemble StructureMap. Fais-moi bęte.

1

Thy en utilisant la méthode AddInstances pour ajouter vos instances nommées

ObjectFactory.Initialize(x => 
{ 
    x.For<IMyInterface>().AddInstances(i => 
    { 
     i.Type<ObjectA>().Named("Foo"); 
     i.Type<ObjectB>().Named("Bar"); 
    }); 
}); 

Cela fonctionne pour moi, mais je suis d'accord la documentation peut parfois être tout à fait trompeuse entre les versions et il m'a fallu un certain temps pour arriver à ce la première fois.

+0

Cela a également fonctionné à la fin :) – Terry