RegisterSingleOpenGeneric

RegisterSingleOpenGeneric

我已经注册了“开放通用类型”,如下所示:

_container.RegisterSingleOpenGeneric(
    typeof(StandardCacheItemByKeyRetriever<>),
    typeof(StandardCacheItemByKeyRetriever<>));


然后,我尝试按以下方式两次检索实例:

var t1 = _container.GetInstance<StandardCacheItemByKeyRetriever<SettingData>>();
var t2 = _container.GetInstance<StandardCacheItemByKeyRetriever<SettingData>>();


考虑到我正在使用t1t2是否不应该等于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


抱歉您偶然发现了这个。

09-25 18:26