2
respostas

Injeção de dependência de Repository

Minha dúvida é ao registrar o serviço de repositório na classe Startup

services.AddTransient<IRepository<Livro>, RepositorioBaseEF<Livro>>();

Em um sistema de médio porte posso chegar facilmente a mais de 100 entidades no meu modelo de dados. Para isso eu teria que registrar mais de 100 serviços de repositório ?

2 respostas

Oi Alberto, tudo bem?

Uma instância transitória, ou temporária (transient) é criada cada vez que é solicitada pelo contêiner de serviço. Esse tempo de vida funciona melhor para serviços leves e sem estado.

Uma instância com tempo de vida Transient criada por injeção de dependência...

public class MinhaClasse
{
    private readonly RepositorioBaseEF<Livro> repositorioLivro;

    public MinhaClasse(IRepository<Livro> repositorioLivro)
{
    this.repositorioLivro = repositorioLivro;
}
}

... equivale a criar uma instância no construtor de MinhaClasse, algo como:

public class MinhaClasse
{
    private readonly RepositorioBaseEF<Livro> repositorioLivro;

    public MinhaClasse()
{
    this.repositorioLivro = new RepositorioBaseEF<Livro> repositorioLivro();
}
}

Ou seja, a instância repositorioLivro acima será criada tantas vezes quanto uma instância de MinhaClasse. Exemplo: Um código (cliente) JavaScript faz uma requisição HTTP GET para um serviço ASP.NET Core, que por sua vez cria MinhaClasse 5 vezes. Nesse caso, serão criadas 5 instâncias de RepositorioBaseEF<Livro>, que serão descartadas quando as 5 instâncias de MinhaClasse também forem descartadas.

É claro que existe um "overhead" (custo) de criar uma instância de RepositorioBaseEF<Livro>. Se você quiser diminuir esse custo de construção, pode criar a instância registrando "por escopo". Exemplo: Um código (cliente) JavaScript faz uma requisição HTTP GET para um serviço ASP.NET Core, que por sua vez cria MinhaClasse 5 vezes. Nesse caso, será criada apenas 1 instância de RepositorioBaseEF<Livro>, que será descartada quando as 5 instâncias de MinhaClasse também forem descartadas:

services.AddScoped<IRepository<Livro>, RepositorioBaseEF<Livro>>();

Outra opção é usar registrar a injeção de dependência para criar uma única instância "singleton" que existirá durante todo o tempo de vida da aplicação. Exemplo: 15 clientes JavaScript fazem várias requisições HTTP GET para um serviço ASP.NET Core, que por sua vez criam instâncias de MinhaClasse 125 vezes no total. Nesse caso, será criada apenas 1 instância de RepositorioBaseEF<Livro>, que será descartada quando todas 125 instâncias de MinhaClasse também forem descartadas:

services.AddSingleton<IRepository<Livro>, new RepositorioBaseEF<Livro>()>();

Para maiores informações, consulte: [# Injeção de dependência no ASP.NET Core](https://docs.microsoft.com/pt-br/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2)

Ainda um pouco confuso. Se meu cliente Javascript por exemplo faz uma requisição HttpGET supondo que a classe MinhaClasse() for do tipo APIController, por que motivo iria instância 5 vezes a MinhaClasse() , tem algum exemplo para ficar mais claro?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software