Как определить, находится ли именованный экземпляр в контейнере в StructureMap 2.6? - PullRequest
2 голосов
/ 07 февраля 2010

Я ранее использовал SM 2.5.3. У меня был какой-то код, который хранил именованный экземпляр объекта, который выглядел так:

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

Затем, чтобы запросить один из предметов из контейнера, я бы сделал:

return ObjectFactory.GetNamedInstance<T>(key);

Если бы конкретный именованный экземпляр не был в контейнере, это взорвалось бы, и я поймал исключение и возвратил ноль. Вот как я мог определить, было ли что-то помещено в контейнер или нет (использовал это для кеширования небольших фрагментов данных).

Однако вчера я обновил код до 2.6, и теперь он всегда возвращает экземпляр того, чем является «T», даже если именованный экземпляр не существует в контейнере. Даже новый метод TryGetInstance () делает это. Итак, мой вопрос: как мне узнать, находится ли именованный экземпляр на самом деле в контейнере? Я заметил, что получение неименованных экземпляров не ведет себя таким образом.

Вот так выглядит мой новый регистрационный код:

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

Если кто-нибудь может сказать мне, что я делаю неправильно, или у меня есть более подходящее предложение для этого, я был бы очень признателен!

1 Ответ

2 голосов
/ 07 февраля 2010

Я нашел решение. При извлечении именованного экземпляра из контейнера теперь я использую возможности объекта Model, чтобы проверить, есть ли там именованный экземпляр:

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

return default(T);

Это также позволяет мне избавиться от блока try ... catch, который у меня был раньше, и это хорошо. Тем не менее, если у кого-то есть другие предложения, я бы хотел их услышать. Спасибо!

...