Причиной возникновения этой проблемы является использование экземпляра IServiceProvider
. Когда вы регистрируете сервис как singleton, корень IServiceProvider
передается заводскому методу.
Итак, когда у вас есть:
services.AddSingleton<Func<IPersonProvider>>(sp => () => sp.GetService<IPersonProvider>());
Это означает, что sp
должен быть совместим с временем жизни синглтона, которое является только корневым поставщиком услуг.
Чтобы проиллюстрировать, что я имею в виду.
using (var scopedServiceProvider = sp.CreateScope())
{
scopedServiceProvider.GetService<IPersonProvider>(); // valid
sp.GetService<IPersonProvider>(); // not valid
}
Однако, когда ваш фабричный метод имеет временное время жизни, переданный sp
больше не использует корневого поставщика услуг и вместо этого использует производного, где ограничение на создание экземпляров сервисов с ограниченным доступом не применяется.
Чтобы повторить проблему, используемый вами sp
не может создавать сервисы с определенной областью, поэтому дело не в том, что возвращаемая служба является Func
, а в том, что провайдер является корень один.