2013-04-08 4 views
2

Я зарегистрировал «открытого универсального типа», согласно ниже:SimpleInjector container.RegisterSingleOpenGeneric не возвращает тот же экземпляр

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

тогда я пытаюсь получить экземпляр в два раза ниже по:

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

Не должно t1 быть равно t2, учитывая, что я использую RegisterSingleOpenGeneric?

В нижеследующем, b равно false - Если это то же самое, это должно быть правдой, не так ли?

+0

Вы пытались сравнить хэш-коды? –

ответ

1

UPDATE: Это ошибка, которая в настоящее время фиксируется в 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 

Извините, что вы случайно наткнулись на это.

+1

Спасибо за быстрый ответ и обновление версии! –

+1

Подтвержденный рабочий bdw, спасибо! –

Смежные вопросы