我之前使用的是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));
如果有人能告诉我我做错了什么,或者对此有更好的建议,我真的很感激!
答案 0 :(得分:2)
我找到了解决方案。从容器中检索命名实例时,我现在使用Model对象的功能来检查命名实例是否存在:
if (ObjectFactory.Model.InstancesOf<T>().Any(x => x.Name == itemName))
{
return ObjectFactory.GetNamedInstance<T>(itemName);
}
return default(T);
这也让我摆脱了以前的try ... catch块,这是一件好事。不过,如果有人有任何其他建议,我想听听他们的意见。 谢谢!