2010-02-07 10 views
2

J'avais précédemment utilisé SM 2.5.3. J'ai eu un code qui a stocké une instance nommée d'un objet qui ressemblait à ceci:Comment savoir si une instance nommée se trouve dans le conteneur dans StructureMap 2.6?

ObjectFactory.Configure(x => 
    x.ForRequestedType<T>() 
     .TheDefault.IsThis(item) 
     .WithName(itemName)); 

ensuite pour demander l'un des éléments du conteneur, je le ferais:

return ObjectFactory.GetNamedInstance<T>(key); 

Si le particulier nommé instance n'était pas dans le conteneur, cela ferait exploser et j'ai attrapé l'exception et retourné null. C'était ainsi que je pouvais dire si quelque chose avait été mis dans le conteneur ou non (l'utilisait pour mettre en cache de petites données).

Cependant, j'ai mis à jour le code à 2.6 hier, et maintenant il renvoie toujours une instance de tout ce que "T" est, même si l'instance nommée n'existe pas dans le conteneur. Même la nouvelle méthode TryGetInstance() le fait. Donc ma question est, comment puis-je dire si l'instance nommée n'est pas en fait dans le conteneur? J'ai remarqué que récupérer des instances non nommées ne se comporte pas de cette manière.

C'est ce que mon nouveau code ressemble d'inscription:

ObjectFactory.Configure(x => x.For<T>().Use(item).Named(itemName)); 

Si quelqu'un peut me dire ce que je fais mal, ou a une meilleure suggestion pour ce faire, je l'apprécie vraiment!

+0

Cela ressemble à un bug introduit en 2.6. Je vais regarder dedans. Vous ne devriez certainement pas avoir à interroger le modèle pour quelque chose comme ça. –

Répondre

2

J'ai trouvé une solution. Lors de la récupération de l'instance nommée du conteneur, j'utilise maintenant les caractéristiques de l'objet modèle pour vérifier si l'instance nommée est là:

if (ObjectFactory.Model.InstancesOf<T>().Any(x => x.Name == itemName)) 
{ 
    return ObjectFactory.GetNamedInstance<T>(itemName); 
} 

return default(T); 

Cela me permet aussi de se débarrasser du bloc try ... catch qui J'avais avant, ce qui est une bonne chose. Pourtant, si quelqu'un a d'autres suggestions, j'aimerais les entendre. Merci!