SimpleInjector container.RegisterSingleOpenGeneric不返回相同的实例

时间:2013-04-08 15:26:18

标签: c# inversion-of-control simple-injector

我已经注册了一个' 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;

1 个答案:

答案 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

对不起,你偶然发现了这件事。