Partilhar via


Vida útil do serviço

Os serviços podem ser registados com uma vida transitória, de âmbito ou singleton. Escolha um tempo de vida adequado para cada serviço registado.

Transient

Um serviço com um tempo de vida transitório é criado cada vez que é solicitado ao contentor de serviço. Para registar um serviço como transitório, ligue para AddTransient.

Em aplicativos que processam solicitações, os serviços transitórios são descartados no final da solicitação. Este ciclo de vida implica alocações por pedido, visto que os serviços são resolvidos e construídos a cada vez. Para mais informações, consulte diretrizes IDisposable para instâncias transitórias e partilhadas.

Âmbito de aplicação

Para aplicações web, um tempo de vida definido indica que os serviços são criados uma vez por pedido do cliente (ligação). Em aplicativos que processam solicitações, os serviços com escopo são descartados no final da solicitação. Registe serviços no escopo chamando AddScoped.

Observação

Ao usar o Entity Framework Core, o método de extensão AddDbContextDbContext registra tipos com um tempo de vida de escopo por padrão.

Um serviço com âmbito deve sempre ser usado dentro de um âmbito – seja um âmbito implícito (como o âmbito por pedido do ASP.NET Core) ou um âmbito explícito criado com IServiceScopeFactory.CreateScope().

Não resolva um serviço com escopo diretamente de um singleton usando a injeção de construtor ou solicitando-o a partir do IServiceProvider singleton. Isso faz com que o serviço com escopo se comporte como um singleton, o que pode levar a um estado incorreto ao processar solicitações subsequentes.

É aceitável resolver um serviço delimitado em um singleton se for criado e usado um escopo explícito com IServiceScopeFactory.

Também é bom para:

  • Resolva um serviço singleton a partir de um serviço com escopo ou transitório.
  • Resolva um serviço com escopo a partir de outro serviço com escopo ou temporário.

Por padrão, no ambiente de desenvolvimento, quando se tenta resolver um serviço a partir de outro com uma vida útil mais longa, é lançada uma exceção. Para obter mais informações, consulte Validação de Escopo.

Singleton

Os serviços vitalícios Singleton são criados de uma das seguintes formas:

  • A primeira vez que são solicitados.
  • Pelo desenvolvedor, ao fornecer uma instância de implementação diretamente para o contêiner. Esta abordagem raramente é necessária.

Cada requisição subsequente da implementação do serviço do contentor de injeção de dependências utiliza a mesma instância. Se a aplicação exigir um comportamento singleton, permita que o contêiner de serviço gerencie o ciclo de vida do serviço. Não implemente o padrão de design singleton e forneça código para descartar o singleton. Os serviços nunca devem ser descartados por código que resolveu o serviço do contêiner. Se um tipo ou fábrica estiver registado como singleton, o contêiner descarta o singleton automaticamente.

Registre serviços singleton com AddSingleton. Os serviços singleton devem ser thread safe e são frequentemente usados em serviços sem monitoração de estado.

Em aplicações que processam solicitações, os serviços singleton são descartados quando o ServiceProvider é descartado no encerramento da aplicação. Como a memória não é liberada até que o aplicativo seja desligado, considere o uso de memória com um serviço singleton.