Quero implementar injeção de dependência (DI) no ASP.NET Core. Então, depois de adicionar esse código ao ConfigureServices
método, as duas maneiras funcionam.
Qual é a diferença entre os métodos services.AddTransient
e service.AddScoped
no ASP.NET Core?
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddScoped<IEmailSender, AuthMessageSender>();
}
c#
asp.net-core
.net-core
Elvin Mammadov
fonte
fonte
Respostas:
TL; DR
Para mais esclarecimentos, este exemplo da documentação do ASP.NET mostra a diferença:
Para demonstrar a diferença entre essas opções de duração e registro, considere uma interface simples que represente uma ou mais tarefas como uma operação com um identificador exclusivo
OperationId
. Dependendo de como configuramos a vida útil desse serviço, o contêiner fornecerá a mesma ou diferentes instâncias do serviço para a classe solicitante. Para deixar claro qual tempo de vida está sendo solicitado, criaremos um tipo por opção de tempo de vida:Implementamos essas interfaces usando uma única classe,
Operation
que aceita um GUID em seu construtor ou usa um novo GUID se nenhum for fornecido:Em seguida, em
ConfigureServices
, cada tipo é adicionado ao contêiner de acordo com sua vida útil nomeada:Observe que o
IOperationSingletonInstance
serviço está usando uma instância específica com um ID conhecido deGuid.Empty
, portanto ficará claro quando esse tipo estiver em uso. Também registramos umOperationService
que depende de cada um dos outrosOperation
tipos, para que fique claro em uma solicitação se esse serviço está recebendo a mesma instância que o controlador, ou um novo, para cada tipo de operação. Tudo que esse serviço faz é expor suas dependências como propriedades, para que possam ser exibidas na exibição.Para demonstrar a vida útil do objeto dentro e entre solicitações individuais separadas para o aplicativo, a amostra inclui uma
OperationsController
que solicita cada tipo deIOperation
tipo e também umaOperationService
. AIndex
ação exibe todos osOperationId
valores do controlador e do serviço .Agora, dois pedidos separados são feitos para esta ação do controlador:
Observe qual dos
OperationId
valores varia dentro de uma solicitação e entre solicitações.Objetos transitórios são sempre diferentes; uma nova instância é fornecida para todo controlador e todo serviço.
Objetos com escopo definido são os mesmos em uma solicitação, mas diferentes em solicitações diferentes
Objetos Singleton são iguais para todos os objetos e solicitações (independentemente de uma instância ser fornecida em
ConfigureServices
)fonte
Na injeção de dependência do .NET, há três grandes vidas úteis:
Singleton que cria uma única instância em todo o aplicativo. Ele cria a instância pela primeira vez e reutiliza o mesmo objeto em todas as chamadas.
Escopo serviços vida útil são criados uma vez por solicitação no escopo. É equivalente a um singleton no escopo atual. Por exemplo, no MVC, ele cria uma instância para cada solicitação HTTP, mas usa a mesma instância nas outras chamadas na mesma solicitação da Web.
Transitório serviços de tempo de vida são criados sempre que solicitados. Esta vida útil funciona melhor para serviços leves e sem estado.
Aqui você pode encontrar e exemplos para ver a diferença:
Injeção de dependência do ASP.NET 5 MVC6 em 6 etapas (link do arquivo da web devido ao link inoperante)
Sua injeção de dependência pronta ASP.NET: ASP.NET 5
E este é o link para a documentação oficial:
Injeção de dependência no ASP.NET Core
fonte
Transiente, com escopo definido e singleton definem o processo de criação de objeto no DI principal do ASP.NET MVC quando vários objetos do mesmo tipo precisam ser injetados. Caso você seja novo na injeção de dependência, pode ver este vídeo DI IoC .
Você pode ver o código do controlador abaixo, no qual solicitei duas instâncias de "IDal" no construtor. Transiente, com escopo definido e Singleton definem se a mesma instância será injetada em "_dal" e "_dal1" ou diferente.
Transitório: em transitório, novas instâncias de objeto serão injetadas em uma única solicitação e resposta. Abaixo está uma imagem de instantâneo em que eu exibi valores GUID.
Escopo: no escopo, a mesma instância do objeto será injetada em uma única solicitação e resposta.
Singleton: no singleton, o mesmo objeto será injetado em todas as solicitações e respostas. Nesse caso, uma instância global do objeto será criada.
Abaixo está um diagrama simples que explica visualmente o fundamental acima.
A imagem acima foi desenhada pela equipe do SBSS quando eu estava fazendo o treinamento do ASP.NET MVC em Mumbai . Um grande obrigado à equipe do SBSS por criar a imagem acima.
fonte
new TService
. O escopo armazenará em cache a primeira inicialização dele para esse "escopo" (solicitação http na maioria dos casos). O Singleton armazenará em cache apenas uma instância por toda a vida útil do aplicativo, simples assim. Os diagramas acima são muito complicados.Normalmente, a solicitação de código deve ser feita através de um parâmetro construtor, como em
Eu queria ressaltar na resposta de @ akazemis que "serviços" no contexto de DI não implica serviços RESTful; serviços são implementações de dependências que fornecem funcionalidade.
fonte
AddSingleton ()
AddSingleton () cria uma única instância do serviço quando é solicitada pela primeira vez e reutiliza a mesma instância em todos os locais onde esse serviço é necessário.
AddScoped ()
Em um serviço com escopo definido, com cada solicitação HTTP, obtemos uma nova instância. No entanto, na mesma solicitação HTTP, se o serviço for necessário em vários locais, como na visualização e no controlador, a mesma instância será fornecida para todo o escopo dessa solicitação HTTP. Mas cada nova solicitação HTTP receberá uma nova instância do serviço.
AddTransient ()
Com um serviço transitório, uma nova instância é fornecida sempre que uma instância de serviço é solicitada, seja no escopo da mesma solicitação HTTP ou em diferentes solicitações HTTP.
fonte
Depois de procurar uma resposta para essa pergunta, encontrei uma explicação brilhante com um exemplo que gostaria de compartilhar com você.
Você pode assistir a um vídeo que demonstra as diferenças AQUI
Neste exemplo, temos este código:
Página inicial
Criar vista
Startup.cs
Copie e cole esse código e pressione o botão criar na visualização e alterne entre eles
AddSingleton
,AddScoped
eAddTransient
você obterá cada vez um resultado diferente que poderá ajudá-lo a entender esta explicação:fonte
Qual usar
Transitório
Escopo
Singleton
Use Singletons onde for necessário manter o estado geral do aplicativo. Configuração ou parâmetros de aplicativos, Serviço de Log, armazenamento em cache de dados são alguns dos exemplos em que você pode usar singletons.
Injetar serviço com vida útil diferente em outro
fonte
Conforme descrito aqui (este link é muito útil) com um exemplo,
fonte
Registrando Serviços
O núcleo do ASP.NET fornece os três métodos a seguir para registrar serviços no contêiner de injeção de dependência. O método que usamos determina a vida útil do serviço registrado.
AddSingleton () - como o nome indica, o método AddSingleton () cria um serviço Singleton. Um serviço Singleton é criado quando é solicitado pela primeira vez. Essa mesma instância é usada por todos os pedidos subseqüentes. Portanto, em geral, um serviço Singleton é criado apenas uma vez por aplicativo e essa instância única é usada durante toda a vida útil do aplicativo.
AddTransient () - este método cria um serviço temporário . Uma nova instância de um serviço temporário é criada sempre que solicitada.
AddScoped () - este método cria um serviço com escopo. Uma nova instância de um serviço com escopo definido é criada uma vez por solicitação dentro do escopo. Por exemplo, em um aplicativo Web, ele cria 1 instância por cada solicitação HTTP, mas usa a mesma instância nas outras chamadas dentro da mesma solicitação Web.
fonte