我已经注册了“开放通用类型”,如下所示:
_container.RegisterSingleOpenGeneric(
typeof(StandardCacheItemByKeyRetriever<>),
typeof(StandardCacheItemByKeyRetriever<>));
然后,我尝试按以下方式两次检索实例:
var t1 = _container.GetInstance<StandardCacheItemByKeyRetriever<SettingData>>();
var t2 = _container.GetInstance<StandardCacheItemByKeyRetriever<SettingData>>();
考虑到我正在使用
t1
,t2
是否不应该等于RegisterSingleOpenGeneric
?在下面,b等于
false
-如果相同,则应为true,对吗?bool b = t1 == t2;
最佳答案
更新:
这是一个错误,现在已在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
抱歉您偶然发现了这个。