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!