1
resposta

Como o injetor de dependência sabe qual valor passar como argumento

Na criação da instância relatório através da injeção de dependência não é passado nenhum argumento, mas o construtor da classe relatório recebe um catálogo como parâmetro. Se eu instanciar dois catalogos, por exemplo, como o injetor de dependência saberá qual deve utilizar?

1 resposta

Olá, Anderson

Compreendo sua dúvida, é realmente um ponto interessante para se entender sobre a injeção de dependências.

O injetor de dependência do ASP.NET Core, ou qualquer outro container de injeção de dependência, usa as informações que você fornece quando registra suas dependências para resolver quais instâncias usar. No seu caso, você está registrando suas dependências no método ConfigureServices().

Quando você registra uma dependência, você normalmente fornece ao menos duas peças de informação: a interface (ou tipo abstrato) que será solicitada, e a implementação concreta que deve ser usada para satisfazer essas solicitações.

Por exemplo, quando você escreve:

services.AddTransient<ICatalogo, Catalogo>();

Você está dizendo ao injetor de dependência: "Quando alguém pedir uma instância de ICatalogo, dê a eles uma nova instância de Catalogo".

Agora, se você tivesse dois catálogos diferentes, por exemplo, Catalogo1 e Catalogo2, e ambos implementassem a interface ICatalogo, você teria que fazer uma escolha ao registrar suas dependências. Você poderia registrar Catalogo1 ou Catalogo2, mas não ambos sob o mesmo tipo de interface ICatalogo. Se você tentar registrar ambos, o último registro irá sobrescrever o anterior.

Então, se você tivesse:

services.AddTransient<ICatalogo, Catalogo1>();
services.AddTransient<ICatalogo, Catalogo2>();

Apenas Catalogo2 seria usado quando uma ICatalogo fosse solicitada, porque Catalogo2 sobrescreveu o registro de Catalogo1.

Se você precisar usar ambos os catálogos, você teria que criar uma segunda interface, talvez ICatalogo2, que Catalogo2 implementaria. Então, você poderia registrar Catalogo2 sob ICatalogo2, e ambos poderiam ser injetados onde fossem necessários.

Espero ter ajudado e bons estudos!