Compartilhar via


Tempo de vida do serviço

Os serviços podem ser registrados com um tempo de vida transitório, escopado ou singleton. Escolha um tempo de vida apropriado para cada serviço registrado.

Transient

Um serviço com um tempo de vida transitório é criado sempre que é solicitado do contêiner de serviço. Para registrar um serviço como transitório, chame AddTransient.

Em aplicativos que processam solicitações, os serviços transitórios são descartados no final da solicitação. Este ciclo de vida resulta em alocações por solicitação, pois os serviços são solucionados e construídos a cada vez. Para obter mais informações, consulte as diretrizes IDisposable para instâncias transitórias e compartilhadas.

Com escopo

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

Observação

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

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

Não resolva um serviço com escopo diretamente de um singleton usando injeção de construtor ou solicitando-o no 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 com escopo dentro de um singleton caso você crie e use um escopo explícito com IServiceScopeFactory.

Também está tudo bem:

  • Resolver um serviço singleton de um serviço com escopo ou transitório.
  • Resolver um serviço em escopo de outro serviço com escopo ou transitório.

Por padrão, no ambiente de desenvolvimento, resolver um serviço de outro serviço com um tempo de vida mais longo gera uma exceção. Para obter mais informações, confira Validação de escopo.

Singleton

Os serviços de tempo de vida singleton são criados:

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

Cada solicitação subsequente da implementação do serviço do contêiner de injeção de dependência usa a mesma instância. Se o aplicativo exigir comportamento singleton, permita que o contêiner de serviço gerencie a vida útil 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 pelo código que resolveu o serviço do contêiner. Se um tipo ou um alocador for registrado como singleton, o contêiner descartará o singleton automaticamente.

Registrar serviços singleton com AddSingleton. Os serviços singleton devem ser thread safe e geralmente são usados em serviços sem estado.

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