如何判断命名实例是否在StructureMap 2.6的容器中?

时间:2010-02-07 02:32:04

标签: inversion-of-control ioc-container structuremap

我之前使用的是SM 2.5.3。我有一些代码存储了一个看起来像这样的对象的命名实例:

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

然后要从容器中请求其中一个项目,我会这样做:

return ObjectFactory.GetNamedInstance<T>(key);

如果特定的命名实例不在容器中,这会爆炸,我捕获异常并返回null。这就是我如何判断是否已将某些东西放入容器中(用于缓存小块数据)。

但是,我昨天将代码更新为2.6,现在它总是返回“T”的实例,即使容器中不存在命名实例。即使是新的TryGetInstance()方法也可以做到这一点。所以我的问题是,如何判断命名实例是否实际上不在容器中?我注意到检索非命名实例的行为不是这样的。

这是我的新注册码:

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

如果有人能告诉我我做错了什么,或者对此有更好的建议,我真的很感激!

1 个答案:

答案 0 :(得分:2)

我找到了解决方案。从容器中检索命名实例时,我现在使用Model对象的功能来检查命名实例是否存在:

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

return default(T);

这也让我摆脱了以前的try ... catch块,这是一件好事。不过,如果有人有任何其他建议,我想听听他们的意见。 谢谢!