我已经注册了一个' open-generic类型',如下所示:
_container.RegisterSingleOpenGeneric(
typeof(StandardCacheItemByKeyRetriever<>),
typeof(StandardCacheItemByKeyRetriever<>));
然后我尝试按以下方式检索实例两次:
var t1 = _container.GetInstance<StandardCacheItemByKeyRetriever<SettingData>>();
var t2 = _container.GetInstance<StandardCacheItemByKeyRetriever<SettingData>>();
考虑到我使用的是t1
,我不应该t2
等于RegisterSingleOpenGeneric
吗?
在下面,b等于false
- 如果它相同,那么它应该是真的,对吧?
bool b = t1 == t2;
答案 0 :(得分:1)
<强>更新强> 这是一个现在已在Simple Injector 2.2中修复的错误。
不幸的是,你偶然发现了Simple Injector的一个错误。 RegisterSingleOpenGeneric
无法正确处理您的情况(服务类型等于实现类型)。这导致完全跳过注册,使容器回退到其默认行为,这将创建具有瞬态生活方式的具体类型。
我正在处理错误修复工作。很快就会有新版本(2.2)。我会在发布时更新这个答案。
与此同时,作为一种解决方法,您可以做的是通过接口注册类型,例如:
_container.RegisterSingleOpenGeneric(
typeof(ICacheItemByKeyRetriever<>),
typeof(StandardCacheItemByKeyRetriever<>));
另一种解决方法(不太令人愉快)是手动完成所有注册:
_container.RegisterSingle<StandardCacheItemByKeyRetriever<SettingData>>();
_container.RegisterSingle<StandardCacheItemByKeyRetriever<SomeData>>();
_container.RegisterSingle<StandardCacheItemByKeyRetriever<OtherData>>();
// etc
对不起,你偶然发现了这件事。