Ответ 1
Как уже упоминалось в моем комментарии, TinyIoC имеет ошибку в разрешении Open Generics - он не сохраняет разделенные экземпляры с разными параметрами типа отдельно, и поскольку все регистрации неявно выполняются с .AsSingleton()
по умолчанию, это всегда возвращает первый экземпляр типового типа, который был разрешен для всех последующих запросов на разрешение.
В связи с этим следующее не работает:
container.Register(typeof(IRepository<>), typeof(AzureRepository<>));
Однако существует обходное решение - сделать переходный период регистрации:
container.Register(typeof(IRepository<>), typeof(AzureRepository<>)).AsMultiInstance();
Это создаст новый экземпляр для каждого запроса на разрешение и должным образом почитает параметр типа. Недостатком этого является то, что вы также получаете новый экземпляр каждый раз, когда вы запрашиваете интерфейс с параметром типа, который ранее был разрешен.
Edit
Подтверждено. В разрешении Open Generics используется SingletonFactory
, который после создания экземпляра всегда будет возвращать это для последующих разрешений. Он не знает и не заботится о Generics. Чтобы это работало правильно, потребовался бы GenericSingletonFactory
, который не только сохранил бы один экземпляр, но и словарь с ключом конкретного типа, который будет разрешен.
Хорошо, этого даже не было трудно исправить. Я просто недостаточно понимаю об этом, но я уверен, что он действительно прав.