2

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

_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;
4

1 回答 1

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

很抱歉你偶然发现了这个。

于 2013-04-08T16:18:04.210 回答