Sempre que preciso de serviços transitórios ou com escopo dentro de um serviço singleton ou em segundo plano, eu os crio em um escopo filho:
using var serviceScope = _serviceScopeFactory.CreateScope();
var foo = serviceScope.ServiceProvider.GetRequiredService<Foo>();
No entanto, acabei de notar os documentos da API para CreateScope
o estado:
Retorna: Um IServiceScope controlando o tempo de vida do escopo. Depois que isso for descartado, todos os serviços com escopo que foram resolvidos do IServiceScope.ServiceProvider também serão descartados.
Observe o texto "quaisquer serviços com escopo definido" .
Isso significa que o contêiner com escopo definido não descarta serviços transitórios (apenas serviços com escopo definido)? Sempre pensei que um contêiner filho descarta tudo o que cria e é apenas o contêiner raiz que mantém referências transitórias.
(Estou acostumado com o Autofac e algumas nuances entre ele e o .NET DI são um pouco confusas.)
O texto nesta parte da documentação não está totalmente correto, pelo menos para o contêiner DI padrão - quando o escopo for descartado, ele descartará todas as dependências que pertencem/controlam/construídas pelo próprio escopo. É muito fácil verificar:
E para citar os documentos :